Partager via


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);
}

Règles connexes

Les propriétés ne doivent pas retourner des tableaux