为什么使用IList而不是IEnumerable?

时间:2011-11-05 22:55:14

标签: c# .net

1)我阅读了一些(常规)代码段,并看到了一些使用IList<T>的地方和一些使用IEnumerable的地方。第一个使用后者的优点是什么?

2)c#中的isas。 我了解is进行类型检查,as进行投射。 但到底是什么?强制数据到某个大小的对象? isas何时不同?

2 个答案:

答案 0 :(得分:29)

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

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

另一方面,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 IList?是或否。

as执行“尝试执行此操作”类型检查;如果失败,则返回null;如果成功,则返回类型引用(etc)。基本上,这是一个有效率的事情:

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

效率低于:

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

如果obj为空,它们的行为也会有所不同; is抛出异常; as返回null

答案 1 :(得分:3)

  1. IList提供IEnumerable没有的某些方法。最重要的是,能够添加它(有关更多信息,请查看msdn
  2. is比较类型,如果某个对象可以转换为类型则返回。 as实际执行该转换,如果失败则返回null。转换意味着无论出于何种原因,将A类型的对象转换为B类型的对象。