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 Son Dakika
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Dışarıdan görünür, yazılabilir bir özellik, System.Collections.ICollection gerçekleştiren bir türdendir. 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ıları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 engeller, ancak yine de tek tek üyelerin ayarlanmasına izin verir. Koleksiyonu değiştirmek 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. Clear sınıfının AddRange ve System.Collections.ArrayList yöntemlerine bu desenin bir örneği olarak bakın.

hem ikili hem de XML serileştirmesi, koleksiyonlar olan salt okunur özellikleri destekler. Bu sınıf, System.Xml.Serialization.XmlSerializer ve ICollection'yi uygulayan türlerin seri hale geçirilebilmesi için belirli gereksinimlere sahiptir.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için aşağıdaki yaklaşımlardan birini kullanın:

  • Özelliği salt okunur veya sadece başlatılabilir yapın. Salt okunur veya yalnızca başlatma özelliği, tek tek üyelerin ayarlanmasına izin verirken koleksiyonun değiştirilmesini engeller. Tasarım için koleksiyonun içeriğinin değiştirilmesi gerekiyorsa, koleksiyonu temizlemek ve yeniden doldurmak için yöntemler ekleyin. Bu desenin bir örneği için ArrayList.Clear ve ArrayList.AddRange yöntemlerine bakın.

  • Özellik türünü salt okunur koleksiyon türüne değiştirin. Çağıranların koleksiyonu değiştirmesi gerekmiyorsa, özelliğin türünü ReadOnlyCollection<T> gibi salt okunur bir koleksiyon olarak değiştirin. Bu yaklaşım, salt okunur niyeti tür bildiriminde açıkça belirtir.

  • Özelliği salt okunur tutarken özellik türünü iş parçacığı açısından güvenli eşzamanlı koleksiyon türüyle değiştirin. Tasarım, koleksiyonu birden çok iş parçacığıyla eşzamanlı olarak değiştirmeyi gerektiriyorsa, ConcurrentBag<T> gibi eşzamanlı bir koleksiyon türünde, ayarlayıcı olmadan salt okunur bir özelliği tanımlayın. CA2227, koleksiyon türü tarafından değil, yazılabilir bir koleksiyon özelliği tarafından tetiklendiği için, özelliğin yine de salt okunur olması gerekir. Eşzamanlı koleksiyon seçimi, yalnızca döndürülen koleksiyon örneğinin iş parçacığı güvenli mutasyonunu ele alır.

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 ve koleksiyonu doğrudan nasıl değiştirebileceğiniz gösterilmektedir. Ayrıca Clear ve AddRange yöntemlerini kullanarak salt okunur bir koleksiyon özelliğini değiştirmenin tercih edilen yolunu 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 = ["a", "new", "collection"];

        WritableCollection collection = new()
        {
            // This line of code demonstrates how the entire collection
            // can be replaced by a property that's not read only.
            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.