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 8'de 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 noneolarak 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 AddRange yöntemlerini kullanarak Clear 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

Ayrıca bkz.