Condividi tramite


CA1035: Le implementazioni di ICollection hanno membri fortemente tipizzati

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

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

L'oggetto ICollection implementa l'interfaccia System.Collections.IEnumerable.Se gli oggetti della raccolta estendono System.ValueType, è necessario fornire un membro fortemente tipizzato per il metodo GetEnumerator allo scopo di evitare un calo delle prestazioni causato dal boxing.Non è richiesto quando gli oggetti della raccolta 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 dalla raccolta.I tipi sicuri sostituiscono i tipi meno sicuri quali Object e Array dichiarati dall'interfaccia.

Come correggere le 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 se si implementa una nuova raccolta basata su oggetti, ad esempio un albero binario, in cui i tipi che estendono la nuova raccolta 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

CA1038: Gli enumeratori devono essere fortemente tipizzati

CA1039: Gli elenchi sono fortemente tipizzati

Vedere anche

Riferimenti

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object