Ответ 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
.