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 |
Metode ToImmutable
tidak perlu dipanggil pada koleksi yang tidak dapat diubah dari namespace layanan System.Collections.Immutable.
Namespace layanan System.Collections.Immutable berisi jenis yang menentukan koleksi yang tidak dapat diubah. Aturan ini menganalisis jenis koleksi yang tidak dapat diubah berikut:
- System.Collections.Immutable.ImmutableArray<T>
- System.Collections.Immutable.ImmutableList<T>
- System.Collections.Immutable.ImmutableHashSet<T>
- System.Collections.Immutable.ImmutableSortedSet<T>
- System.Collections.Immutable.ImmutableDictionary<TKey,TValue>
- System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>
Jenis ini menentukan metode ekstensi yang membuat koleksi yang tidak dapat diubah baru dari koleksi IEnumerable<T> yang sudah ada.
- ImmutableArray<T> menentukan ToImmutableArray.
- ImmutableList<T> menentukan ToImmutableList.
- ImmutableHashSet<T> menentukan ToImmutableHashSet.
- ImmutableSortedSet<T> menentukan ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> menentukan ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> menentukan ToImmutableSortedDictionary.
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.
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.
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.
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.
Umpan balik .NET
.NET adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: