Почему array реализует IList?
определение
5 ответов:
потому что массив позволяет быстрый доступ по индексу, и
IList
/IList<T>
is являются единственными интерфейсами коллекции, которые поддерживают это. Поэтому, возможно, ваш реальный вопрос: "почему нет интерфейса для постоянных коллекций с индексаторами?"И на это у меня нет ответа.для коллекций также нет интерфейсов только для чтения. И я пропускаю их даже больше, чем постоянный размер с интерфейсом индексаторов.
ИМО должно быть еще несколько (общих) коллекций интерфейсы в зависимости от особенностей коллекции. И имена тоже должны были быть разными,
List
для чего-то с индексатором действительно глупо ИМО.
- Просто Перечисление
IEnumerable<T>
- только для чтения, но нет индексатора (.Рассчитывать. ,Содержит.,..)
- изменение размера, но без индексатора, т. е. установить как (добавить, удалить,...) текущий
ICollection<T>
- только для чтения с индексатором (indexer, indexof,...)
- постоянный размер с индексатором (indexer с сеттер)
- переменный размер с индексатором (вставка,...) текущий
IList<T>
Я думаю, что текущие интерфейсы коллекции-это плохой дизайн. Но поскольку у них есть свойства, сообщающие вам, какие методы действительны (и это является частью контракта этих методов), это не нарушает принцип подстановки.
В разделе "примечания" о документация на
IList
говоритIList является потомком Интерфейс ICollection и является базой интерфейс всех неродовых списков. реализации IList делятся на три категории: только для чтения, фиксированный размер и переменный размер. Только для чтения IList невозможно изменить. Фиксированного размера объекта IList не допускает добавления или удаления элементов, но это позволяет модификация существующих элементы. Один переменная-размер объекта IList позволяет добавление, удаление и модификация элементы.
очевидно, что массивы попадают в категорию фиксированного размера, поэтому по определению интерфейса это имеет смысл.
, потому что не все
IList
s изменчивы (см.IList.IsFixedSize
иIList.IsReadOnly
), и массивы, безусловно, ведут себя как списки фиксированного размера.Если ваш вопрос действительно "почему он реализует non-generic интерфейс", то ответ заключается в том, что они были вокруг, прежде чем дженерики пришел.
это наследие, которое мы имеем со времен, когда было неясно, как работать с коллекциями только для чтения и является ли массив только для чтения. В интерфейсе IList есть флаги IsFixedSize и IsReadOnly. Флаг IsReadOnly означает, что коллекция не может быть изменена вообще, а IsFixedSize означает, что коллекция позволяет изменять, но не добавлять или удалять элементы.
во время .Net 4.5 было ясно, что для работы с некоторыми" промежуточными " интерфейсами требуется читайте только коллекции, так что
IReadOnlyCollection<T>
иIReadOnlyList<T>
были представлены.вот отличный пост в блоге, описывающий детали:коллекции только для чтения в .NET
определение интерфейса IList " представляет собой неродовой набор объектов, которые могут быть индивидуально доступны по индексу.". Массив полностью удовлетворяет этому определению, поэтому необходимо реализовать интерфейс. Исключение при вызове метода Add () - "System.NotSupportedException: коллекция была фиксированного размера" и произошло потому, что массив не может увеличить свою емкость динамически. Его емкость определяется при создании объекта массива.