CA2227: as propriedades de coleção devem ser somente leitura
TypeName |
CollectionPropertiesShouldBeReadOnly |
CheckId |
CA2227 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Quebra |
Causa
Uma propriedade gravável externamente visível é um tipo que implementa ICollection.Matrizes, os indicadores (propriedades item com o nome “"), e os conjuntos de permissões são ignorados pela regra.
Descrição da Regra
Uma propriedade gravável da coleção permite que um usuário substitui a coleção o com uma coleção completamente diferente.Uma propriedade somente leitura para a coleção de ser substituído mas ainda permite que membros individuais são definidos.Se a substituição a coleção é uma meta, o padrão preferencial de design é incluir um método para remover todos os elementos da coleção e um método para repopular a coleção.Consulte os métodos de Clear e de AddRange da classe de ArrayList para obter um exemplo desse padrão.
Binários e o serialização XML oferece suporte às propriedades somente leitura que são coleções.A classe de XmlSerializer tem requisitos específicos para os tipos que implementam ICollection e IEnumerable para ser serializáveis.
Como Corrigir Violações
Para corrigir uma violação desta regra, faça a propriedade somente leitura e, se o design requer a, adicionar métodos para limpar e preencha novamente a coleção.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo
O exemplo a seguir mostra um tipo com uma propriedade gravável da coleção e mostra como a coleção pode ser substituída diretamente.Além disso, o modo preferido de substituir uma propriedade somente leitura da coleção usando Clear e métodos de AddRange é 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);
}