CA1035: Implementações de ICollection com rigidez de tipos membros
TypeName |
ICollectionImplementationsHaveStronglyTypedMembers |
CheckId |
CA1035 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Quebrando |
Causa
Um tipo de público ou protegido implementa System.Collections.ICollection , mas não fornece um método com rigidez de tipos de ICollection.CopyTo. A versão com rigidez de tipos do CopyTo deve aceitar dois parâmetros e não pode ter um System.Array ou uma matriz de System.Object como primeiro parâmetro.
Descrição da regra
Esta regra requer ICollection implementações para fornecer altamente digitado membros para que os usuários não precisam converter argumentos para o Object tipo quando usarem a funcionalidade que é fornecida pela interface. Esta regra pressupõe que o tipo que implementa ICollection faz isso para gerenciar uma coleção de instâncias de um tipo mais forte do que Object.
ICollectionimplementa o System.Collections.IEnumerable interface. Se os objetos na coleção estendem System.ValueType, você deve fornecer um membro com rigidez de tipos de GetEnumerator para evitar a diminuição no desempenho que é causado pela conversão boxing. Não é necessário quando os objetos da coleção são um tipo de referência.
Para implementar uma versão com rigidez de tipos de um membro de interface, implemente os membros de interface explicitamente usando nomes no formulário InterfaceName.InterfaceMemberName, como CopyTo. Os membros de interface explícita usar os tipos de dados que são declarados pela interface. Implementar membros fortemente tipados usando o nome do membro de interface, como CopyTo. Declarar os membros com rigidez de tipos como public e declarar parâmetros e retornar valores a ser do tipo de alta segurança é gerenciado pela coleção. Os tipos de alta seguras substituir os tipos mais fracos como Object e Array que são declaradas pela interface.
Como corrigir violações
Para corrigir uma violação desta regra, implementar o membro de interface explicitamente (declará-lo como CopyTo). Adicionar o membro com rigidez de tipos público, declarado como CopyTo, e ainda levar a uma matriz fortemente tipada como primeiro parâmetro.
Quando suprimir avisos
Suprimir um aviso da regra, se você implementar uma nova coleção baseada em objeto, como, por exemplo, uma árvore binária, onde a tipos de estendem a nova coleção determinam o tipo de alta segurança. Esses tipos devem cumprir 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();
}
}
}
Regras relacionadas
CA1038: Enumeradores devem ser fortemente tipados
CA1039: Listas são fortemente tipadas
Consulte também
Referência
System.Collections.IEnumerable