CA1035 : Les implémentations ICollection possèdent des membres fortement typés

TypeName

ICollectionImplementationsHaveStronglyTypedMembers

CheckId

CA1035

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

Un type public ou protégé implémente System.Collections.ICollection mais ne fournit pas de méthode fortement typée pour ICollection.CopyTo. La version fortement typée de CopyTo doit accepter deux paramètres et ne peut pas avoir un System.Array ou un tableau de System.Object en tant que premier paramètre.

Description de la règle

Cette règle requiert que les implémentations ICollection fournissent des membres fortement typés afin que les utilisateurs ne soient pas tenus d'effectuer un cast d'arguments en type Object lorsqu'ils utilisent les fonctionnalités fournies par l'interface. Cette règle suppose que le type qui implémente ICollection le fasse pour gérer une collection d'instances d'un type plus fort que Object.

ICollection implémente l'interface System.Collections.IEnumerable. Si les objets dans la collection étendent System.ValueType, vous devez fournir un membre fortement typé pour que GetEnumerator évite la baisse des performances provoquée par le boxing. Ceci n'est pas requis quand les objets de la collection sont un type référence.

Pour implémenter une version fortement typée d'un membre d'interface, implémentez explicitement les membres d'interface à l'aide de noms dans le formulaire InterfaceName.InterfaceMemberName, tels que CopyTo. Les membres d'interface explicites utilisent les types de données déclarés par l'interface. Implémentez les membres fortement typés à l'aide du nom de membre d'interface, tel que CopyTo. Déclarez les membres fortement typés comme publics et déclarez des paramètres et des valeurs de retour de sorte qu'ils soient du type fort géré par la collection. Les types forts remplacent les types plus faibles, tels que Object et Array, déclarés par l'interface.

Comment corriger les violations

Pour corriger une violation de cette règle, implémentez le membre d'interface explicitement (déclarez-le en tant que CopyTo). Ajoutez le membre fortement typé public, déclaré comme CopyTo, et faites-lui accepter un tableau fortement typé en tant que premier paramètre.

Quand supprimer les avertissements

Supprimez un avertissement de cette règle si vous implémentez une nouvelle collection fondée sur des objets, telle qu'une arborescence binaire, où des types qui étendent la nouvelle collection déterminent le type fort. Ces types doivent se conformer à cette règle et exposer des membres fortement typés.

Exemple

L'exemple suivant présente la façon correcte d'implémenter 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();
      }
   }
}

Règles connexes

CA1038 : Les énumérateurs doivent être fortement typés

CA1039 : Les listes sont fortement typées

Voir aussi

Référence

System.Array

System.Collections.IEnumerable

System.Collections.ICollection

System.Object