Почему array реализует IList?


определение

5 125

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: коллекция была фиксированного размера" и произошло потому, что массив не может увеличить свою емкость динамически. Его емкость определяется при создании объекта массива.