Ответ 1
-
IEnumerable<T>
- это базовый интерфейс, который расширяется или реализуется. Он не позволяет осуществлять прямой доступ и только для чтения. Поэтому используйте это, только если вы собираетесь итерации по коллекции. -
ICollection<T>
extendsIEnumerable<T>
, но дополнительно позволяет добавлять, удалять, проверять, присутствует ли элемент в коллекции и получить общее количество элементов. Он не позволяет напрямую обращаться к элементу по индексу. Это будет операция O (n), так как вам нужно начать повторять ее, пока не найдете соответствующий элемент. -
IList<T>
extendsICollection<T>
(и, следовательно, наследует все его свойства), но дополнительно позволяет напрямую обращаться к элементам по индексу. Это операция O (1). -
List<T>
- это всего лишь конкретная реализация интерфейсаIList<T>
.
В вашем коде вы всегда должны показывать тип, который является наивысшим в иерархии объектов, который будет соответствовать потребностям вызывающих. Например, если вызывающие абоненты собираются перечислить только набор данных, используйте IEnumerable<T>
. Если они должны иметь прямой доступ к элементам по индексу, выведите IList<T>
.
List<T>
должен использоваться только внутри вашего кода, но обычно не присутствует в сигнатуре методов, которые вы подвергаете. Это дает вам большую гибкость, так как вы легко можете заменить конкретную реализацию, не нарушая контракт.