CA1035: ICollection-Implementierungen weisen Member mit starker Typisierung auf
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 stark typisierte Member 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 bereitstellen, damit GetEnumerator die Abnahme an der Leistung verhindert, die von Boxing verursacht wird. Dies ist nicht erforderlich, wenn die Objekte der Auflistung einen Verweistyp aufweisen.
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.
Behandeln von Verstößen
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
CA1038: Enumeratoren sollten eine starke Typisierung aufweisen
CA1039: Listen weisen eine starke Typisierung auf
Siehe auch
Referenz
System.Collections.IEnumerable