CA2009: ImmutableCollection değerinde ToImmutableCollection çağrısı yapma
Özellik | Değer |
---|---|
Kural Kimliği | CA2009 |
Başlık | Bir ImmutableCollection değeri üzerinde ToImmutableCollection çağırma |
Kategori | Güvenilirlik |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
ToImmutable
yöntemi, ad alanından System.Collections.Immutable sabit bir koleksiyonda gereksiz yere çağrıldı.
Kural açıklaması
System.Collections.Immutable ad alanı, sabit koleksiyonları tanımlayan türler içerir. Bu kural aşağıdaki sabit koleksiyon türlerini analiz eder:
- 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>
Bu türler, mevcut IEnumerable<T> bir koleksiyondan yeni sabit bir koleksiyon oluşturan uzantı yöntemlerini tanımlar.
- ImmutableArray<T> tanımlar ToImmutableArray.
- ImmutableList<T> tanımlar ToImmutableList.
- ImmutableHashSet<T> tanımlar ToImmutableHashSet.
- ImmutableSortedSet<T> tanımlar ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> tanımlar ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> tanımlar ToImmutableSortedDictionary.
Bu uzantı yöntemleri, değiştirilebilir bir koleksiyonu sabit bir koleksiyona dönüştürmek için tasarlanmıştır. Ancak çağıran, bu yöntemlere giriş olarak yanlışlıkla sabit bir koleksiyon geçirebilir. Bu, bir performansı ve/veya işlevsel bir sorunu temsil edebilir.
- Performans sorunu: Gereksiz kutulama, kutu açma ve/veya çalışma zamanı türü sabit bir koleksiyon üzerinde denetimler gerçekleştirir.
- Olası işlevsel sorun: Çağıranın, aslında sabit bir koleksiyona sahip olduğunda, değiştirilebilir bir koleksiyon üzerinde çalıştığını varsayar.
İhlalleri düzeltme
İhlalleri düzeltmek için sabit bir koleksiyondaki yedekli ToImmutable
çağrıyı kaldırın. Örneğin, aşağıdaki iki kod parçacığı kuralın ihlalini ve bunların nasıl düzeltileceğini gösterir:
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);
}
}
İpucu
Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+ Sunulan seçenekler listesinden Yedekli aramayı kaldır'ı seçin.
Uyarıların ne zaman bastırılması gerekiyor?
Sabit koleksiyonların gereksiz ayırmalarından kaynaklanan performans etkisinden endişe duymadığınız sürece, bu kuraldaki ihlalleri bastırmayın.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.