Condividi tramite


Le implementazioni di ICollection hanno membri fortemente tipizzati

Aggiornamento: novembre 2007

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo pubblico o protetto implementa System.Collections.ICollection, ma non fornisce un metodo fortemente tipizzato per ICollection.CopyTo. La versione fortemente tipizzata di CopyTo deve accettare due parametri e non può avere System.Array o una matrice di System.Object come primo parametro.

Descrizione della regola

Questa regola richiede che le implementazioni di ICollection forniscano membri fortemente tipizzati in modo che agli utenti non venga richiesto di eseguire il cast degli argomenti nel tipo Object quando viene utilizzata la funzionalità fornita dall'interfaccia. Questa regola presuppone che il tipo che implementa ICollection esegua questa operazione per gestire un insieme di istanze di un tipo più sicuro di Object.

L'oggetto ICollection implementa l'interfaccia System.Collections.IEnumerable. Se gli oggetti dell'insieme estendono System.ValueType, è necessario fornire un membro fortemente tipizzato per GetEnumerator al fine di evitare il calo delle prestazioni causato dal boxing. Questa operazione non è necessaria se gli oggetti dell'insieme sono un tipo di riferimento.

Per implementare una versione fortemente tipizzata di un membro di interfaccia, implementare in modo esplicito i membri di interfaccia utilizzando nomi nel formato InterfaceName.InterfaceMemberName, ad esempio CopyTo. I membri di interfaccia espliciti utilizzano i tipi di dati dichiarati dall'interfaccia. Implementare i membri fortemente tipizzati mediante il nome del membro dell'interfaccia, ad esempio CopyTo. Dichiarare i membri fortemente tipizzati come pubblici e dichiarare i parametri e i valori restituiti in modo che siano del tipo sicuro gestito dall'insieme. I tipi sicuri sostituiscono i tipi meno sicuri quali Object e Array dichiarati dall'interfaccia.

Correzione di violazioni

Per correggere una violazione di questa regola, implementare in modo esplicito il membro di interfaccia (dichiararlo come CopyTo). Aggiungere il membro pubblico fortemente tipizzato, dichiarato come CopyTo e fare in modo che accetti una matrice fortemente tipizzata come primo parametro.

Esclusione di avvisi

Escludere un avviso da questa regola quando si implementa un nuovo insieme basato su oggetti, ad esempio una struttura binaria, in cui i tipi che estendono il nuovo insieme determinano il tipo sicuro. Questi tipi devono essere conformi a questa regola ed esporre membri fortemente tipizzati.

Esempio

Nell'esempio riportato di seguito viene illustrato il modo corretto di implementare ICollection.

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();
      }
   }
}

Regole correlate

Gli enumeratori devono essere fortemente tipizzati

Gli elenchi sono fortemente tipizzati

Vedere anche

Riferimenti

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object