Udostępnij za pośrednictwem


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

Zobacz też

Informacje

CollectionBase

ICollection

IEnumerable

IList

Object