Share via


ICollection-Implementierungen weisen Member mit starker Typisierung auf

Aktualisiert: November 2007

     TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

Kategorie

Microsoft.Design

Unterbrechende Änderung

Breaking

Ursache

Ein öffentlicher oder geschützter Typ implementiert System.Collections.ICollection, gibt jedoch keine stark typisierte Methode für ICollection.CopyTo an. Die stark typisierte Version von CopyTo muss zwei Parameter annehmen und kann kein System.Array oder ein Array von System.Object als ersten Parameter aufweisen.

Regelbeschreibung

Nach dieser Regel müssen ICollection-Implementierungen Member mit starker Typisierung angeben, damit die Benutzer keine Argumente in den Object-Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden. Diese Regel setzt voraus, dass der Typ, der ICollection implementiert, diese Implementierung zur Verwaltung einer Auflistung von Instanzen eines Typs vornimmt, der stärker ist als Object.

ICollection implementiert die System.Collections.IEnumerable-Schnittstelle. Wenn die Objekte in der Auflistung System.ValueType erweitern, müssen Sie einen stark typisierten Member für GetEnumerator angeben, um durch Boxing verursachte Leistungseinbußen zu vermeiden. Dies ist nicht erforderlich, wenn es sich bei den Objekten der Auflistung um einen Verweistyp handelt.

Wenn Sie eine stark typisierte Version eines Schnittstellenmembers implementieren möchten, implementieren Sie die Schnittstellenmember explizit. Verwenden Sie dazu Namen mit der Form InterfaceName.InterfaceMemberName, z. B. CopyTo. Die expliziten Schnittstellenmember verwenden die von der Schnittstelle deklarierten Datentypen. Implementieren Sie die stark typisierten Member mithilfe des Schnittstellenmembernamens, z. B. CopyTo. Deklarieren Sie die stark typisierten Member als öffentlich, und deklarieren Sie Parameter sowie Rückgabewerte mit dem von der Auflistung verwalteten starken Typ. Die starken Typen ersetzen schwächere Typen, z. B. Object und Array, die von der Schnittstelle deklariert werden.

Verstoßbehandlung

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Schnittstellenmember explizit (deklarieren Sie ihn als CopyTo). Fügen Sie den als CopyTo deklarierten öffentlichen stark typisierten Member hinzu, und lassen Sie diesen ein stark typisiertes Array als ersten Parameter annehmen.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn Sie eine neue objektbasierte Auflistung implementieren, beispielsweise eine Binärstruktur, in der Typen, die die neue Auflistung erweitern, den starken Typ bestimmen. Diese Typen sollten dieser Regel entsprechen und stark typisierte Member verfügbar machen.

Beispiel

Im folgenden Beispiel wird die richtige Implementierung von ICollection veranschaulicht.

using System;
using System.Collections;
namespace DesignLibrary
{

   public class ExceptionCollection : ICollection
   {   
      private ArrayList data;

      ExceptionCollection()
      {
         data = new ArrayList();
      }

      // Provide the explicit interface member for ICollection.
      void ICollection.CopyTo(Array array, int index)
      {
         data.CopyTo(array, index);
      }

      // Provide the strongly typed member for ICollection.
      public void CopyTo(Exception[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }

      // Implement the rest of the ICollection members.
      public int Count
      {
        get 
        {
           return data.Count;
        }
      }

      public object SyncRoot
      {
         get 
        {
           return this; 
        }
      }

      public bool IsSynchronized
      {
         get 
         {
            return false; 
         }
      }

      // The IEnumerable interface is implemented by ICollection.
      // Because the type underlying this collection is a reference type,
      // you do not need a strongly typed version of GetEnumerator.

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

Verwandte Regeln

Enumeratoren sollten eine starke Typisierung aufweisen

Listen weisen eine starke Typbindung auf

Siehe auch

Referenz

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object