Baca dalam bahasa Inggris

Bagikan melalui


CA2009: Jangan panggil ToImmutableCollection pada nilai ImmutableCollection

Properti Nilai
ID Aturan CA2009
Judul Jangan panggil ToImmutableCollection pada nilai ImmutableCollection
Golongan Keandalan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 9 Sebagai saran

Penyebab

Metode ToImmutable tidak perlu dipanggil pada koleksi yang tidak dapat diubah dari namespace layanan System.Collections.Immutable.

Deskripsi aturan

Namespace layanan System.Collections.Immutable berisi jenis yang menentukan koleksi yang tidak dapat diubah. Aturan ini menganalisis jenis koleksi yang tidak dapat diubah berikut:

Jenis ini menentukan metode ekstensi yang membuat koleksi yang tidak dapat diubah baru dari koleksi IEnumerable<T> yang sudah ada.

Metode ekstensi ini dirancang untuk mengonversi koleksi yang dapat diubah ke koleksi yang tidak dapat diubah. Namun, pemanggil mungkin secara tidak sengaja meneruskan koleksi yang tidak dapat diubah sebagai input ke metode ini. Hal ini dapat merepresentasikan performa dan/atau masalah fungsi.

  • Masalah performa: Boxing, unboxing, dan/atau pemeriksaan jenis runtime yang tidak perlu pada koleksi yang tidak dapat diubah.
  • Potensi masalah fungsional: Pemanggil diasumsikan beroperasi pada koleksi yang dapat diubah, jika benar-benar memiliki koleksi yang tidak dapat diubah.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran, hapus panggilan ToImmutable redundan pada koleksi yang tidak dapat diubah. Misalnya, dua cuplikan kode berikut menunjukkan pelanggaran aturan dan cara memperbaikinya:

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This leads to CA2009.
        M2(immutableArray.ToImmutableArray());
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}
using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This is now fine.
        M2(immutableArray);
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}

Tip

Perbaikan kode tersedia untuk aturan ini di Visual Studio. Untuk menggunakannya, posisikan kursor pada pelanggaran dan tekan Ctrl+. (titik). Pilih Hapus panggilan redundan dari daftar opsi yang ditampilkan.

Perbaikan kode untuk CA2009 - Jangan panggil ToImmutableCollection pada nilai ImmutableCollection

Kapan harus menekan peringatan

Jangan menyembunyikan pelanggaran dari aturan ini, kecuali jika Anda tidak khawatir mengenai dampak performa dari alokasi yang tidak perlu dari koleksi yang tidak dapat diubah.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Lihat juga