CA2227: Koleksiyon özellikleri salt okunur olmalıdır

TürAdı

CollectionPropertiesShouldBeReadOnly

CheckId

CA2227

Kategori

Microsoft.Usage

Bozan Değişiklik

Bozan

Sebep

Dışarıdan görünen bir yazılabilir özellikği olan tür ICollection uygular.Diziler, dizinleyiciler ('Madde' adlı özellikler) ve izin kümeleri kural tarafından dikkate alınmaz.

Kural Tanımı

Yazılabilir koleksiyon özelliği kullanıcının koleksiyonu tamamiyle farklı bir koleksiyonla değiştirmesine izin verir.Salt okunur özelliği değiştirilmesini durdurur ancak yine de tekil üyelerin ayarlamasına izin verir.Eğer koleksiyon değiştirme amaçsa, önerilen tasarım deseni bütün elemanları koleksiyondan silen ve koleksiyonu tekrar oluşturan bir metoddur.Bkz: ArrayList sınıfındaki Clear ve AddRange yöntemleri bu desen için bir örnektir.

İkili ve XML serileştirmenin ikisi de salt okunur koleksiyonları destekler.XmlSerializer sınıfı serileştirme yerine ICollection ve IEnumerable uygulamak için belirli gereksinimlere ihtiyaç duyar.

İhlallerin Düzeltilmesi

Bu kural ihlalini düzeltmek için özelliği salt okunur yapın ve eğer tasarım gerektiriyorsa koleksiyonu temizlemek ve yeniden oluşturmak için metodlar ekleyin.

Uyarılar Ne Zaman Bastırılmalı

Bu kuraldan bir uyarı gizlemeyin.

Örnek

Aşağıdaki örnek yazılabilir bir koleksiyon örneği ve koleksiyonun doğrudan nasıl değiştirilebileceğine dair bir tür gösterir.Ek olarak, Clear ve AddRange yöntemlerini kullanarak salt okunur bir koleksiyon özelliğinin değiştirilmesi tercih edilir.

Imports System
Imports System.Collections

Namespace UsageLibrary

   Public Class WritableCollection

      Dim strings As ArrayList

      Property SomeStrings As ArrayList
         Get 
            Return strings
         End Get 

         ' Violates the rule. 
         Set
            strings = Value
         End Set 
      End Property 

      Sub New()
         strings = New ArrayList( _
            New String() {"IEnumerable", "ICollection", "IList"} )
      End Sub 

   End Class 

   Class ViolatingVersusPreferred

      Shared Sub Main()
         Dim newCollection As New ArrayList( _
            New String() {"a", "new", "collection"} )

         ' strings is directly replaced with newCollection. 
         Dim collection As New WritableCollection()
         collection.SomeStrings = newCollection

         ' newCollection is added to the cleared strings collection.
         collection.SomeStrings.Clear()
         collection.SomeStrings.AddRange(newCollection)
      End Sub 

   End Class 

End Namespace

İlgili Kurallar

CA1819: Özellikler diziler döndürmemelidir