CA2227: Koleksiyon özellikleri salt okunur olmalıdır
Özellik | Değer |
---|---|
Kural Kimliği | CA2227 |
Başlık | Koleksiyon özellikleri salt okunur olmalıdır |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Dışarıdan görünür, yazılabilir bir özellik, uygulayan System.Collections.ICollectionbir türdür. Bu kural dizileri, dizin oluşturucuları ('Item' adlı özellikler), sabit koleksiyonları, salt okunur koleksiyonları ve izin kümelerini yoksayar.
Kural açıklaması
Yazılabilir koleksiyon özelliği, kullanıcının koleksiyonu tamamen farklı bir koleksiyonla değiştirmesine olanak tanır. Salt okunur veya yalnızca başlatma özelliği koleksiyonun değiştirilmesini durdurur, ancak yine de tek tek üyelerin ayarlanmasına izin verir. Koleksiyonun değiştirilmesi bir hedefse, tercih edilen tasarım deseni koleksiyondaki tüm öğeleri kaldırmak için bir yöntem ve koleksiyonu yeniden doldurmak için bir yöntem eklemektir. Bu desenin Clear bir örneği için sınıfının ve AddRange yöntemlerine System.Collections.ArrayList bakın.
hem ikili hem de XML serileştirmesi, koleksiyonlar olan salt okunur özellikleri destekler. sınıfı, System.Xml.Serialization.XmlSerializer uygulayan ICollection türler ve System.Collections.IEnumerable serileştirilebilir olması için belirli gereksinimlere sahiptir.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için özelliğini salt okunur veya salt başlatmalı yapın. Tasarım gerektiriyorsa, koleksiyonu temizlemek ve yeniden doldurmaya yönelik yöntemler ekleyin.
Uyarıların ne zaman bastırılması gerekiyor?
Özellik bir Veri Aktarım Nesnesi (DTO) sınıfının parçasıysa uyarıyı gizleyebilirsiniz.
Aksi takdirde, bu kuraldan gelen uyarıları gizlemeyin.
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 CA2227
// The code that's violating the rule is on this line.
#pragma warning restore CA2227
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.CA2227.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte yazılabilir koleksiyon özelliğine sahip bir tür gösterilir ve koleksiyonun doğrudan nasıl değiştirilebileceği gösterilir. Ayrıca, ve Clear
yöntemlerini kullanarak AddRange
salt okunur bir koleksiyon özelliğini değiştirmenin tercih edilen yöntemini gösterir.
public class WritableCollection
{
public ArrayList SomeStrings
{
get;
// This set accessor violates rule CA2227.
// To fix the code, remove this set accessor or change it to init.
set;
}
public WritableCollection()
{
SomeStrings = new ArrayList(new string[] { "one", "two", "three" });
}
}
class ReplaceWritableCollection
{
static void Main2227()
{
ArrayList newCollection = new ArrayList(new string[] { "a", "new", "collection" });
WritableCollection collection = new WritableCollection();
// This line of code demonstrates how the entire collection
// can be replaced by a property that's not read only.
collection.SomeStrings = newCollection;
// If the intent is to replace an entire collection,
// implement and/or use the Clear() and AddRange() methods instead.
collection.SomeStrings.Clear();
collection.SomeStrings.AddRange(newCollection);
}
}
Public Class WritableCollection
' This property violates rule CA2227.
' To fix the code, add the ReadOnly modifier to the property:
' ReadOnly Property SomeStrings As ArrayList
Property SomeStrings As ArrayList
Sub New()
SomeStrings = New ArrayList(New String() {"one", "two", "three"})
End Sub
End Class
Class ViolatingVersusPreferred
Shared Sub Main2227()
Dim newCollection As New ArrayList(New String() {"a", "new", "collection"})
Dim collection As New WritableCollection()
' This line of code demonstrates how the entire collection
' can be replaced by a property that's not read only.
collection.SomeStrings = newCollection
' If the intent is to replace an entire collection,
' implement and/or use the Clear() and AddRange() methods instead.
collection.SomeStrings.Clear()
collection.SomeStrings.AddRange(newCollection)
End Sub
End Class