C# 为什么在IEnumerable上使用IList?
1) 我读了一些(常规)代码片段,看到一些地方使用了C# 为什么在IEnumerable上使用IList?,c#,.net,C#,.net,1) 我读了一些(常规)代码片段,看到一些地方使用了IList,还有一些地方使用了IEnumerable。使用前者的优点是什么 2) 在c#中是和作为。 我知道,是进行类型检查的,与进行铸造一样。 但究竟什么是铸造?强制数据到某个大小的对象?当为和为时不同 IList提供了某些IEnumerable没有的方法。最重要的是,添加到它的功能(有关更多信息,请查看) is比较类型,返回是否可以将某个对象强制转换为类型as实际执行该转换,如果失败,则返回null。强制转换是指出于任何原因将A类型的对象转
IList
,还有一些地方使用了IEnumerable
。使用前者的优点是什么
2) 在c#中是
和作为
。
我知道,是
进行类型检查的,与
进行铸造一样。
但究竟什么是铸造?强制数据到某个大小的对象?当为
和为
时不同
IList
提供了某些IEnumerable
没有的方法。最重要的是,添加到它的功能(有关更多信息,请查看)is
比较类型,返回是否可以将某个对象强制转换为类型as
实际执行该转换,如果失败,则返回null
。强制转换是指出于任何原因将A
类型的对象转换为B
类型的对象IList[]
表示以下内容:
- 可以迭代
- 是有限的,已知的大小
- 是可重复的
- 可以通过索引随机访问
- 可编辑(可选,可检查):重新分配值、添加、删除等
IEnumerable
,只能进行迭代。并不是所有可以迭代的东西都是列表。例如:
static IEnumerable<int> Get() {
Random rand = new Random();
while(true) yield return rand.Next();
}
is
执行类型检查,返回true
/false
。。。i、 e.是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
大多数情况下,在C#中,强制转换不会在类型之间转换对象。通常,它只是在运行时检查对象是否为给定的编译时类型,如果是,则允许您将对象分配到所述类型的变量中。(如果不是,则返回null
或抛出异常,这取决于您是否将parens或用作
)事实上,它通常指的是强制,而不是转换。您是否实际衡量了这两种方法的性能?IL指令是isinst,尽管它的名称表明它与as操作相对应。在伊利诺伊州没有任何行动。实际上是在IL isobj as type!=空
。所以选择应该是可读性,我想say@RuneFS我经常用IL编写代码,所以我很清楚这一点。然而,不同之处在于isinst之后的额外castclass。我承认,这是一个微小的区别。我认为JIT编译器应该能够优化这个类转换。但我不知道它当前是否存在。顺便说一句,如果对象为null,则不会引发异常。表达式将计算为false:@Rune我一定是记错了。。。我的道歉
var list = obj as IList;
if(list != null) {
...
}