CA1035: Las implementaciones de ICollection tienen miembros fuertemente tipados
TypeName |
ICollectionImplementationsHaveStronglyTypedMembers |
Identificador de comprobación |
CA1035 |
Categoría |
Microsoft.Design |
Cambio problemático |
Problemático |
Motivo
Un tipo público o protegido implementa ICollection pero no proporciona un método fuertemente tipado para ICollection.CopyTo.La versión fuertemente tipada de CopyTo debe aceptar dos parámetros y no puede tener una Array o una matriz de Object como su primer parámetro.
Descripción de la regla
Esta regla requiere que las implementaciones de ICollection proporcionen miembros fuertemente tipados para que los usuarios no necesiten convertir los argumentos en el tipo Object cuando utilicen la funcionalidad proporcionada por la interfaz.Esta regla supone que el tipo que implementa ICollection lo hace para administrar una colección de instancias de un tipo que es más segura que Object.
ICollection implementa la interfaz IEnumerable.Si los objetos de la colección extienden ValueType, debe proporcionar un miembro fuertemente tipado para que GetEnumerator evite la disminución de rendimiento que se produce aplicando la conversión boxing.Esto no se requiere cuando los objetos de la colección son un tipo de referencia.
Para implementar una versión fuertemente tipada de un miembro de interfaz, implemente los miembros de interfaz utilizando explícitamente los nombres en el formulario InterfaceName.InterfaceMemberName, como CopyTo.Los miembros de la interfaz explícitos utilizan los tipos de datos declarados por la interfaz.Implemente los miembros fuertemente tipados utilizando el nombre del miembro de la interfaz, como CopyTo.Declare los miembros fuertemente tipados como públicos, y declare los parámetros y valores devueltos para que sean del tipo seguro que administra la colección.Los tipos con establecimiento inflexible reemplazan a los tipos más débiles como Object y Array declarados por la interfaz.
Cómo corregir infracciones
Para corregir una infracción de esta regla, implemente explícitamente el miembro de la interfaz (declárela como CopyTo).Agregue el miembro fuertemente tipado público, declarado como CopyTo, y pase una matriz fuertemente tipada como su primer parámetro.
Cuándo suprimir advertencias
Suprima una advertencia de esta regla si implementa una colección nueva basada en objetos, como un árbol binario, donde los tipos que extienden la nueva colección determinan el establecimiento inflexible de tipos.Estos tipos deberían cumplir esta regla y exponer los miembros fuertemente tipados.
Ejemplo
El ejemplo siguiente muestra la manera correcta 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();
}
}
}
Reglas relacionadas
CA1038: Los enumeradores deben estar fuertemente tipados
CA1039: Las listas están fuertemente tipadas