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应该明确他到底在做什么。我们只能想象他是什么意思,并试图对此作出回应。