CA1039: списки обладают строгой типизацией
Товар | Значение |
---|---|
Идентификатор правила | CA1039 |
Категория | Microsoft.Design |
Критическое изменение | Критическое |
Причина
Общедоступный или защищенный тип реализуется System.Collections.IList , но не предоставляет строго типизированный метод для одного или нескольких следующих типов:
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
Примечание.
Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".
Описание правила
Это правило требует IList реализации для предоставления строго типизированных элементов, чтобы пользователи не требовали приведения аргументов к System.Object типу при использовании функциональных возможностей, предоставляемых интерфейсом. Интерфейс IList реализуется коллекциями объектов, к которым можно получить доступ по индексу. Это правило предполагает, что тип, реализующий IList коллекцию экземпляров типа, который сильнее Object.
IListSystem.Collections.ICollection реализует интерфейсы и System.Collections.IEnumerable интерфейсы. При реализации IListнеобходимо указать необходимые строго типизированные элементы для ICollection. Если объекты в коллекции расширяются System.ValueType, необходимо предоставить строго типизированный элемент, чтобы GetEnumerator избежать снижения производительности, вызванного боксом. Это не обязательно, если объекты коллекции являются ссылочным типом.
Чтобы соответствовать этому правилу, реализуйте элементы интерфейса явным образом с помощью имен в формате InterfaceName.InterfaceMemberName, например Add. Явные члены интерфейса используют типы данных, объявленные интерфейсом. Реализуйте строго типизированные элементы с помощью имени члена интерфейса, например Add
. Объявите строго типизированные элементы как общедоступные, а также объявите параметры и возвращайте значения строгого типа, управляемого коллекцией. Сильные типы заменяют более слабые типы, такие как Object и Array объявленные интерфейсом.
Устранение нарушений
Чтобы устранить нарушение этого правила, явно реализуйте IList члены и предоставляйте строго типизированные альтернативные варианты для участников, которые были отмечены ранее. Код, который правильно реализует IList интерфейс и предоставляет необходимые строго типизированные элементы, см. в следующем примере.
Когда лучше отключить предупреждения
Подавляйте предупреждение из этого правила при реализации новой объектной коллекции, например связанного списка, где типы, расширяющие новую коллекцию, определяют сильный тип. Эти типы должны соответствовать этому правилу и предоставлять строго типизированные элементы.
Пример
В следующем примере тип YourType
расширяется System.Collections.CollectionBase, так как все строго типизированные коллекции должны. CollectionBase предоставляет явную реализацию IList интерфейса. Поэтому необходимо предоставить только строго типизированные элементы для IList и ICollection.
using System;
using System.Collections;
namespace DesignLibrary
{
public class YourType
{
// Implementation for your strong type goes here.
public YourType() {}
}
public class YourTypeCollection : CollectionBase
{
// Provide the strongly typed members for IList.
public YourType this[int index]
{
get
{
return (YourType) ((IList)this)[index];
}
set
{
((IList)this)[index] = value;
}
}
public int Add(YourType value)
{
return ((IList)this).Add ((object) value);
}
public bool Contains(YourType value)
{
return ((IList)this).Contains((object) value);
}
public void Insert(int index, YourType value)
{
((IList)this).Insert(index, (object) value);
}
public void Remove(YourType value)
{
((IList)this).Remove((object) value);
}
public int IndexOf(YourType value)
{
return ((IList)this).IndexOf((object) value);
}
// Provide the strongly typed member for ICollection.
public void CopyTo(YourType[] array, int index)
{
((ICollection)this).CopyTo(array, index);
}
}
}
Связанные правила
CA1035: в составе реализаций ICollection есть строго типизированные элементы
CA1038: перечислители должны быть строго типизированы
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по