Списки обладают строгой типизацией
Обновлен: Ноябрь 2007
TypeName |
ListsAreStronglyTyped |
CheckId |
CA1039 |
Категория |
Microsoft.Design |
Критическое изменение |
Критическое |
Причина
Открытый или защищенный тип реализует System.Collections.IList, но не предоставляет метод со строгой типизацией для одного или нескольких следующих объектов:
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
Описание правила
Это правило требует, чтобы реализации IList предоставляли члены со строгой типизацией, чтобы пользователям не приходилось приводить аргументы к типу System.Object при использовании функциональности интерфейса. Интерфейс IList реализуется коллекциями объектов, доступ к которым осуществляется посредством индекса. В этом правиле предполагается, что тип, реализующий IList, делает это для управления коллекцией экземпляров типа, более строгого, чем Object.
IList реализует интерфейсы System.Collections.ICollection и System.Collections.IEnumerable. При реализации IList нужно предоставить необходимые члены со строгой типизацией для ICollection. Если объекты в коллекции расширяют System.ValueType, нужно предоставить член со строгой типизацией для GetEnumerator, чтобы избежать снижения производительности, вызванной упаковкой. Этого не требуется, если объекты коллекции являются ссылочным типом.
Для выполнения этого правила реализуйте члены интерфейса с явным использованием имен в форме ИмяИнтерфейса.ИмяЧленаИнтерфейса, например 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);
}
}
}
Связанные правила
В составе реализаций ICollection есть члены со строгим типом
Перечислители должны быть строго типизированы
См. также
Ссылки
System.Collections.CollectionBase
System.Collections.ICollection