Зачем использовать IList над IEnumerable?

1) Я прочитал некоторый (общий) фрагмент кода и увидел некоторые места, которые использовали IList<T> и некоторые используемые IEnumerable. Каковы преимущества использования первого над последним?

2) is и as в С#. Я понимаю, что is выполняет проверку типа, а as выполняет кастинг. Но что именно бросает? форсировать данные до определенного размера? когда is и as отличаются?

Ответы

Ответ 1

A IList[<T>] представляет что-то, что:

  • может быть повторен
  • имеет конечный, известный размер
  • повторяется
  • можно получить случайным образом по индексу
  • можно (необязательно, можно проверить): отредактировать значения, добавить, удалить и т.д.

An IEnumerable, с другой стороны, может быть только повторен. Не все, что можно повторить, это списки. Например:

static IEnumerable<int> Get() {
    Random rand = new Random();
    while(true) yield return rand.Next();
}

что ^^^ - бесконечная последовательность. Он не имеет длины, не может быть мутирован, к нему нельзя получить доступ по индексу... однако его можно повторить:

foreach(int i in Get().Take(200)) {
    Console.WriteLine(i);
}

is выполняет проверку типа, которая возвращает true/false... т.е. obj a IList? да или нет.

as выполняет операцию "попытаться сделать это"; он возвращает null, если он терпит неудачу, или типизированная ссылка (и т.д.), если она успешна. В принципе, это вещь эффективности:

if(obj is IList) {
    var list = (IList) obj;
    ...
}

менее эффективен, чем:

var list = obj as IList;
if(list != null) {
    ...
}

они также ведут себя по-другому, если obj равно null; is выдает исключение; as возвращает null.

Ответ 2

  • IList предлагает определенные методы, которые IEnumerable не поддерживает. Самое главное, возможность добавить к нему (для получения дополнительной информации просмотрите msdn)
  • is сравнивает типы, возвращая, если определенный объект может быть задан для типа. as на самом деле выполняет этот приведение, возвращая null, если он не сработал. Кастинг означает преобразование объекта типа A в объект типа B по любой причине.