CA1039: Listen weisen eine starke Typisierung auf
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.SchnittstellenMemberName, 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.
Behandeln 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. Beachten Sie, dass CollectionBase die explizite Implementierung der IList-Schnittstelle für Sie bereitstellt. Daher müssen Sie nur die stark typisierten Member für IList und ICollection bereitstellen.
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
CA1035: ICollection-Implementierungen weisen Member mit starker Typisierung auf
CA1038: Enumeratoren sollten eine starke Typisierung aufweisen
Siehe auch
Referenz
System.Collections.CollectionBase
System.Collections.ICollection