为什么使用IList而不是IEnumerable?

Ela*_*nda 15 .net c#

1)我读了一些(一般)代码片段,看到了IList<T>一些使用过的地方和一些使用过的地方IEnumerable.使用第一个优于后者的优点是什么?

2)isasc#.我明白 is做类型检查并as做铸造.但到底是什么?强制数据到某个大小的对象?什么时候isas不同?

Mar*_*ell 29

A IList[<T>]表示以下内容:

  • 可以迭代
  • 是有限的,已知的大小
  • 是可重复的
  • 可以通过索引随机访问
  • 可以(可选地,可检查)编辑:重新分配值,添加,删除等

IEnumerable另一方面,An 只能迭代.并非所有可以迭代的东西都是列表.例如:

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

^^^是一个无限的序列.它没有长度,不能变异,不能通过索引访问...但是,它可以迭代:

foreach(int i in Get().Take(200)) {
    Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)

is执行一个返回类型检查true/ false...即 obj一个IList?是还是不是.

as执行"尝试做这个"类型检查; null如果失败则返回,如果成功则返回类型引用(etc).基本上,这是一个效率的事情:

if(obj is IList) {
    var list = (IList) obj;
    ...
}
Run Code Online (Sandbox Code Playgroud)

效率低于:

var list = obj as IList;
if(list != null) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果obj为null,它们的行为也会不同; is抛出异常; as回报null.