CA2227: Koleksiyon özellikleri salt okunur olmalıdır
TürAdı |
CollectionPropertiesShouldBeReadOnly |
CheckId |
CA2227 |
Kategori |
Microsoft.Usage |
Bozan Değişiklik |
Bozan |
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.
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.
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.
Bu kuraldan bir uyarı gizlemeyin.
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
using System;
using System.Collections;
namespace UsageLibrary
{
public class WritableCollection
{
ArrayList strings;
public ArrayList SomeStrings
{
get { return strings; }
// Violates the rule.
set { strings = value; }
}
public WritableCollection()
{
strings = new ArrayList(
new string[] {"IEnumerable", "ICollection", "IList"} );
}
}
class ReplaceWritableCollection
{
static void Main()
{
ArrayList newCollection = new ArrayList(
new string[] {"a", "new", "collection"} );
// strings is directly replaced with newCollection.
WritableCollection collection = new WritableCollection();
collection.SomeStrings = newCollection;
// newCollection is added to the cleared strings collection.
collection.SomeStrings.Clear();
collection.SomeStrings.AddRange(newCollection);
}
}
}
using namespace System;
using namespace System::Collections;
namespace UsageLibrary
{
public ref class WritableCollection
{
public:
// Violates the rule.
property ArrayList^ SomeStrings;
WritableCollection()
{
SomeStrings = gcnew ArrayList(
gcnew array<String^> {"IEnumerable", "ICollection", "IList"} );
}
};
}
using namespace UsageLibrary;
void main()
{
ArrayList^ newCollection = gcnew ArrayList(
gcnew array<String^> {"a", "new", "collection"} );
// strings is directly replaced with newCollection.
WritableCollection^ collection = gcnew WritableCollection();
collection->SomeStrings = newCollection;
// newCollection is added to the cleared strings collection.
collection->SomeStrings->Clear();
collection->SomeStrings->AddRange(newCollection);
}