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();
}
}
}
Regras relacionadas
CA1038: Enumeradores devem ser fortemente tipados
CA1039: Listas são fortemente tipadas
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de