Propriedades de coleção devem ser somente leitura
TypeName |
CollectionPropertiesShouldBeReadOnly |
CheckId |
CA2227 |
Category (Categoria) |
Microsoft.uso |
Quebrando alterar |
Quebrando |
Causa
Uma propriedade gravável visível externamente é um tipo que implementa System.Collections.ICollection. Arrays, os indexadores (propriedades com o nome 'Item') e conjuntos de permissões são ignorados pela regra.
Descrição da regra
Uma propriedade de coleção gravável permite que um usuário substituir a coleção com um conjunto totalmente diferente.Uma propriedade somente leitura pára a coleção de que está sendo substituída, mas ainda permite que os membros individuais sejam definidas.Se substituir a coleção é um meta, o padrão de design preferencial é incluir um método para remover todos os elementos da coleção e um método para popular a coleção.Consulte o Clear e AddRange métodos para o System.Collections.ArrayList classe para obter um exemplo desse padrão.
Binário e serialização XML oferecem suporte a propriedades somente leitura que são coleções.The System.Xml.Serialization.XmlSerializer classe tem requisitos específicos para tipos que implementam ICollection e System.Collections.IEnumerable para que seja serializável.
Como corrigir violações
Para corrigir uma violação dessa regra, tornar a propriedade somente leitura e, se o design exigir, adicione métodos para desmarcar e popular a coleção.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
O exemplo a seguir mostra um tipo com uma propriedade de coleção gravável e mostra como a coleção pode ser substituída diretamente.Além disso, a maneira preferida de substituição de uma propriedade de coleção somente leitura usando Clear e AddRange métodos é mostrado.
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);
}