CA1035: в составе реализаций ICollection есть строго типизированные элементы
Товар | Значение |
---|---|
Идентификатор правила | CA1035 |
Категория | Microsoft.Design |
Критическое изменение | Критическое |
Причина
Общедоступный или защищенный тип реализуетSystem.Collections.ICollection, но не предоставляет строго типизированный метод.System.Collections.ICollection.CopyTo Строго типизированная версия CopyTo должна принимать два параметра и не может иметь System.Array массив в System.Object качестве первого параметра.
Примечание.
Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".
Описание правила
Это правило требует ICollection реализации для предоставления строго типизированных элементов, чтобы пользователи не требовали приведения аргументов к Object типу при использовании функциональных возможностей, предоставляемых интерфейсом. Это правило предполагает, что тип, реализующий ICollection такую возможность, позволяет управлять коллекцией экземпляров типа, который сильнее Object.
Класс ICollection реализует интерфейс списка System.Collections.IEnumerable. Если объекты в коллекции расширяются System.ValueType, необходимо предоставить строго типизированный элемент, чтобы GetEnumerator избежать снижения производительности, вызванного боксом. Это не обязательно, если объекты коллекции являются ссылочным типом.
Чтобы реализовать строго типизированную версию члена интерфейса, реализуйте элементы интерфейса явным образом с помощью имен в форме InterfaceName.InterfaceMemberName
, например CopyTo. Явные члены интерфейса используют типы данных, объявленные интерфейсом. Реализуйте строго типизированные элементы с помощью имени члена интерфейса, например CopyTo. Объявите строго типизированные элементы как общедоступные, а также объявите параметры и возвращайте значения строгого типа, управляемого коллекцией. Сильные типы заменяют более слабые типы, такие как Object и Array объявленные интерфейсом.
Устранение нарушений
Чтобы устранить нарушение этого правила, явным образом реализуйте член интерфейса (объявите его как CopyTo). Добавьте общедоступный строго типизированный член, объявленный как CopyTo
и укажите строго типизированный массив в качестве первого параметра.
Когда лучше отключить предупреждения
Подавляйте предупреждение из этого правила, если вы реализуете новую объектную коллекцию, например двоичное дерево, где типы, расширяющие новую коллекцию, определяют сильный тип. Эти типы должны соответствовать этому правилу и предоставлять строго типизированные элементы.
Пример
В следующем примере показан правильный способ реализации 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: перечислители должны быть строго типизированы
CA1039: списки обладают строгой типизацией
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по