【发布时间】:2011-11-05 22:55:14
【问题描述】:
1) 我阅读了一些(通用)代码 sn-p 并看到一些使用IList<T> 的地方和一些使用IEnumerable 的地方。使用前者而不是后者的优点是什么?
2) is 和 as 在 c# 中。
我知道is 进行类型检查,as 进行强制转换。
但究竟什么是铸造?强制数据到某个大小的对象? is 和 as 什么时候不同?
【问题讨论】:
1) 我阅读了一些(通用)代码 sn-p 并看到一些使用IList<T> 的地方和一些使用IEnumerable 的地方。使用前者而不是后者的优点是什么?
2) is 和 as 在 c# 中。
我知道is 进行类型检查,as 进行强制转换。
但究竟什么是铸造?强制数据到某个大小的对象? is 和 as 什么时候不同?
【问题讨论】:
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,或者如果它成功,它返回一个类型化的引用(等)。基本上,这是一个效率问题:
if(obj is IList) {
var list = (IList) obj;
...
}
效率低于:
var list = obj as IList;
if(list != null) {
...
}
如果obj 为空,它们的行为也会有所不同; is 抛出异常; as 返回null。
【讨论】:
obj as type != null blogs.msdn.com/b/ericlippert/archive/2010/09/16/…。所以选择应该是我想说的可读性
IList 提供了 IEnumerable 没有的某些方法。最重要的是,能够添加到它(有关更多信息,请查看msdn)is 比较类型,返回是否可以将某个对象强制转换为类型。 as 实际上执行该转换,如果失败则返回 null。强制转换意味着将 A 类型的对象转换为 B 类型的对象,无论出于何种原因。【讨论】:
null 或抛出异常,具体取决于您使用parens 还是as。)