Les propriétés de collection doivent être en lecture seule
Mise à jour : novembre 2007
TypeName |
CollectionPropertiesShouldBeReadOnly |
CheckId |
CA2227 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Oui |
Cause
Une propriété accessible en écriture extérieurement visible est un type qui implémente System.Collections.ICollection. Les tableaux, les indexeurs (propriétés portant le nom 'Item') et les jeux d'autorisations sont ignorés par la règle.
Description de la règle
Une propriété de collection accessible en écriture permet à un utilisateur de remplacer la collection par une collection complètement différente. Une propriété en lecture seule empêche le remplacement de la collection, mais permet quand même aux membres individuels d'être définis. Si le remplacement de la collection est un objectif, le schéma de conception recommandé consiste à inclure une méthode pour supprimer tous les éléments de la collection et une méthode pour remplir de nouveau la collection. Consultez les méthodes Clear et AddRange de la classe System.Collections.ArrayList pour obtenir un exemple de ce schéma.
Les sérialisations binaire et XML prennent en charge les propriétés en lecture seule qui sont des collections. La classe System.Xml.Serialization.XmlSerializer a des conditions requises spécifiques pour les types pour qui implémentent ICollection et System.Collections.IEnumerable afin d'être sérialisables.
Comment corriger les violations
Pour corriger une violation de cette règle, rendez la propriété accessible en lecture seule et, si la conception le requiert, ajoutez des méthodes pour vider et remplir de nouveau la collection.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant montre un type avec une propriété de collection accessible en écriture et comment la collection peut être directement remplacée. En outre, il montre la meilleure manière de remplacer une propriété de collection en lecture seule à l'aide des méthodes Clear et AddRange.
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);
}