Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Foreach循环获取IEnumerable<;T>;_C#_Generics_Ienumerable - Fatal编程技术网

C# Foreach循环获取IEnumerable<;T>;

C# Foreach循环获取IEnumerable<;T>;,c#,generics,ienumerable,C#,Generics,Ienumerable,使用foreach循环遍历一组值类型时,是否需要获得IEnumerable接口,而不是非通用的IEnumerable接口,为了防止不需要的中间行李指令在编译的代码中出现?现在没有理由自己实现非通用的IEnumerable。在某些情况下,您将被迫使用它,例如,在依赖旧的IEnumerable实现的集合中,您没有控制权 它主要是为了向后兼容,直到泛型出现在框架(.NET 1.0)之前。如果要实现迭代器,请始终使用IEnumerable 有必要吗 当然没有必要(在本文中,必要意味着需要) 好主意吗:是

使用
foreach
循环遍历一组值类型时,是否需要获得
IEnumerable
接口,而不是非通用的
IEnumerable
接口,为了防止不需要的中间行李指令在编译的代码中出现?

现在没有理由自己实现非通用的
IEnumerable
。在某些情况下,您将被迫使用它,例如,在依赖旧的
IEnumerable
实现的集合中,您没有控制权

它主要是为了向后兼容,直到泛型出现在框架(.NET 1.0)之前。如果要实现迭代器,请始终使用
IEnumerable

有必要吗

当然没有必要(在本文中,必要意味着需要)

好主意吗:是的。在大多数情况下,保存拆箱是一种微观优化(CPU有限的数据处理内部循环除外)。但是,如果您知道您拥有某种类型的值类型的集合,那么保留这些信息不会浪费时间在一个box unbox循环中,并使代码更易于使用


最后一点,考虑到IDE类似intellisense的功能,是迄今为止最有价值的。

有相当多的集合(特别是在UI库中)没有实现
IEnumerable
。虽然可以应用类型的
Cast
OfType
,但这与
foreach
本身执行取消装箱的开销相同。@Richard-我主要指的是自己实现
IEnumerable
,而不是使用不支持它的自定义UI集合。我认为,当你没有选择的时候,你就需要使用它,这是非常微不足道的。这是可以接受的,但——这是非常常见的情况——当我写下我的答案时,我意识到这是一个非常糟糕的问题。不仅仅是使用“必要”一词(意思是必需的),而是询问微观优化。我同意几乎没有理由不让所有自定义集合都是泛型的(我可以认为自定义名称值属性集需要允许任何类型的值),但是为什么要创建自己的集合呢?@Richard我同意,OP应该明确他到底在做什么。我们只能想象他是什么意思,并试图对此作出回应。