CA1039: Listy są silnie typizowane
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Typ publiczny lub chroniony implementuje IList, ale nie dostarcza silnie typizowanej metody dla co najmniej jednej z poniższych:
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
Opis reguły
Reguła ta wymaga implementacji IList, aby dostarczyć silnie typizowane elementy członkowskie, tak aby od użytkowników nie było wymagane rzutowanie argumentów na typ Object, gdy używają funkcji dostarczanych przez interfejs.Interfejs IList jest implementowany przez kolekcje obiektów, do których można uzyskać dostęp przez indeks.Reguła ta zakłada, że typ, który implementuje IList, robi to, aby zarządzać kolekcją wystąpień typu, który jest silniejszy niż Object.
IList implementuje interfejsy ICollection i IEnumerable.Jeśli implementujesz IList, musisz dostarczyć wymagane, silnie typizowane elementy członkowskie dla ICollection.Jeśli obiekty w kolekcji rozszerzają ValueType, musisz dostarczyć silnie typizowane elementy członkowskie dla GetEnumerator, aby uniknąć spadku wydajności, która jest spowodowana przez opakowywanie; nie jest to wymagane, gdy obiekty kolekcji są typami referencyjnymi.
Aby zachować zgodność z tą regułą, zaimplementuj jawnie elementy członkowskie interfejsu przy użyciu nazw w formacie NazwaInterfejsu.NazwaElementuCzlonkowskiegoInterfejsu, tak jak Add.Jawne elementy członkowskie interfejsu używają typów danych, które są zadeklarowane przez interfejs.Zaimplementuj silnie typizowane elementy członkowskie przy użyciu nazwy elementu członkowskiego interfejsu, tak jak Add.Zadeklaruj silnie typizowane elementy członkowskie jako publiczne, a następnie zadeklaruj parametry i wartości zwracane, aby były silnego typu, który jest zarządzany przez kolekcję.Typy silne zastępują typy słabsze, takie jak Object i Array, które są deklarowane przez interfejs.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zaimplementuj jawnie elementy członkowskie IList i dostarcz silnie typizowane alternatywy dla elementów członkowskich, które nie zostały wymienione wcześniej.Aby zapoznać się z kodem, który poprawnie implementuje interfejs IList i dostarcza wymagane, silnie typizowane elementy członkowskie, zobacz poniższy przykład.
Kiedy pominąć ostrzeżenia
Pomiń ostrzeżenie dotyczące tej reguły, jeśli implementujesz nową kolekcję obiektów, taką jak lista połączona, w której typy, który rozszerzają nową kolekcję określają typ silny.Typy te powinny zachować zgodność z tą regułą i uwidocznić silnie typizowane elementy członkowskie.
Przykład
W poniższym przykładzie, typ YourType rozszerza CollectionBase, tak jak powinny wszystkie silnie typizowane kolekcje.Zauważ, że CollectionBase dostarcza jawnej implementacji interfejsu IList.Dlatego wystarczy, że dostarczysz jedynie silnie typizowane elementy członkowskie dla IList i ICollection.
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);
}
}
}
Powiązane reguły
CA1035: Implementacje ICollection mają silnie typizowane elementy członkowskie
CA1038: Wyliczenia powinny być silnie typizowane