Share via


Listen weisen eine starke Typbindung auf

Aktualisiert: November 2007

     TypeName

ListsAreStronglyTyped

CheckId

CA1039

Kategorie

Microsoft.Design

Unterbrechende Änderung

Breaking

Ursache

Der öffentliche oder geschützte Typ implementiert System.Collections.IList, stellt jedoch keine stark typisierte Methode für mindestens eines der folgenden Elemente bereit:

  • IList.Item

  • IList.Add

  • IList.Contains

  • IList.IndexOf

  • IList.Insert

  • IList.Remove

Regelbeschreibung

Nach dieser Regel müssen IList-Implementierungen stark typisierte Member angeben, damit die Benutzer keine Argumente in den System.Object-Typ umwandeln müssen, wenn sie die durch die Schnittstelle zur Verfügung gestellten Funktionen verwenden. Die IList-Schnittstelle wird durch Auflistungen von Objekten implementiert, auf die per Index zugegriffen werden kann. Diese Regel setzt voraus, dass der Typ, der IList implementiert, diese Implementierung zur Verwaltung einer Auflistung von Instanzen eines Typs vornimmt, der stärker ist als Object.

IList implementiert die System.Collections.ICollection-Schnittstelle und die System.Collections.IEnumerable-Schnittstelle. Wenn Sie IList implementieren, müssen Sie die erforderlichen stark typisierten Member für ICollection angeben. 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.

Implementieren Sie die Schnittstellenmember zwecks Einhaltung dieser Regel explizit, und verwenden Sie dabei Namen der Form SchnittstellenName.SchnittstelleMemberName, z. B. Add. Die expliziten Schnittstellenmember verwenden die von der Schnittstelle deklarierten Datentypen. Implementieren Sie die stark typisierten Member mithilfe des Schnittstellenmembernamens, z. B. Add. 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.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie IList-Member explizit, und geben Sie für die zuvor genannten Member stark typisierte Alternativen an. Im folgenden Beispiel ist Code enthalten, durch den die IList-Schnittstelle ordnungsgemäß implementiert wird und der die erforderlichen stark typisierten Member angibt.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn Sie eine neue objektbasierte Auflistung implementieren, beispielsweise eine verknüpfte Liste, 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 System.Collections.CollectionBase durch den YourType-Typ erweitert, wie dies bei allen stark typisierten Auflistungen geschehen sollte. CollectionBase stellt die explizite Implementierung der IList-Schnittstelle automatisch zur Verfügung, sodass Sie die stark typisierten Member lediglich für IList und ICollection angeben müssen.

using System;
using System.Collections;
namespace DesignLibrary
{
   public class YourType
   {
      // Implementation for your strong type goes here.

      public YourType() {}
   }

   public class YourTypeCollection : CollectionBase
   {
      // Provide the strongly typed members for IList.
      public YourType this[int index]
      {
         get 
         {
            return (YourType) ((IList)this)[index];
         }
         set 
         {
            ((IList)this)[index] =  value;
         }
      }

      public int Add(YourType value)
      {
         return ((IList)this).Add ((object) value);
      }

      public bool Contains(YourType value) 
      {
         return ((IList)this).Contains((object) value);
      }

      public void Insert(int index, YourType value) 
      {
         ((IList)this).Insert(index, (object) value);
      }

      public void Remove(YourType value) 
      {
         ((IList)this).Remove((object) value);
      }

      public int IndexOf(YourType value) 
      {
         return ((IList)this).IndexOf((object) value);
      }

      // Provide the strongly typed member for ICollection.

      public void CopyTo(YourType[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }
   }
}

Verwandte Regeln

ICollection-Implementierungen weisen Member mit starker Typisierung auf

Enumeratoren sollten eine starke Typisierung aufweisen

Siehe auch

Referenz

System.Collections.CollectionBase

System.Collections.ICollection

System.Collections.IEnumerable

System.Collections.IList

System.Object