Compartilhar via


CA1035: Implementações ICollection têm membros fortemente tipados

Item Valor
RuleId CA1035
Categoria Microsoft.Design
Alteração da falha Quebra

Causa

Um tipo público ou protegido implementa System.Collections.ICollection, mas não fornece um método fortemente tipado para System.Collections.ICollection.CopyTo. A versão fortemente tipada de CopyTo deve aceitar dois parâmetros e não pode ter uma matriz System.Array ou System.Object como seu primeiro parâmetro.

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Essa regra exige que implementações de ICollection forneçam membros fortemente tipados de modo que os usuários não sejam obrigados a converter argumentos no tipo Object quando usarem a funcionalidade fornecida pela interface. Essa regra pressupõe que o tipo que implementa ICollection faça isso para gerenciar uma coleção de instâncias de um tipo mais forte que Object.

ICollection implementa a interface System.Collections.IEnumerable. Se os objetos na coleção estenderem System.ValueType, você deverá fornecer um membro fortemente tipado para GetEnumerator para evitar a diminuição no desempenho causada pela conversão boxing. Isso não é necessário quando os objetos da coleção são um tipo de referência.

Para implementar uma versão fortemente tipada de um membro de interface, implemente os membros da interface explicitamente usando nomes no formato InterfaceName.InterfaceMemberName, como CopyTo. Os membros explícitos da interface usam os tipos de dados declarados pela interface. Implemente os membros fortemente tipados usando o nome do membro da interface, como CopyTo. Declare os membros fortemente tipados como públicos e declare parâmetros e valores retornados como do tipo forte gerenciado pela coleção. Os tipos fortes substituem tipos mais fracos, como Object e Array, declarados pela interface.

Como corrigir violações

Para corrigir uma violação dessa regra, implemente o membro da interface explicitamente (declare-o como CopyTo). Adicione o membro fortemente tipado público, declarado como CopyTo e faça com que ele use uma matriz fortemente tipada como seu primeiro parâmetro.

Quando suprimir avisos

Suprima um aviso dessa regra, se você implementar uma nova coleção baseada em objeto, como uma árvore binária, em que os tipos que estendem a nova coleção determinam o tipo forte. Esses tipos devem estar em conformidade com essa regra e expor membros fortemente tipados.

Exemplo

O exemplo a seguir demonstra a maneira correta de implementar 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();
      }
   }
}

CA1038: Enumeradores devem ser fortemente tipados

CA1039: Listas são fortemente tipadas

Confira também