1)我阅读了一些(常规)代码段,并看到了一些使用IList<T>
的地方和一些使用IEnumerable
的地方。第一个使用后者的优点是什么?
2)c#中的is
和as
。
我了解is
进行类型检查,as
进行投射。
但到底是什么?强制数据到某个大小的对象? is
和as
何时不同?
答案 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)
IList
提供IEnumerable
没有的某些方法。最重要的是,能够添加它(有关更多信息,请查看msdn)is
比较类型,如果某个对象可以转换为类型则返回。 as
实际执行该转换,如果失败则返回null
。转换意味着无论出于何种原因,将A
类型的对象转换为B
类型的对象。