我一直听说在 .net 3.5 中你应该使用 IEnumerable 而不是 List,但我找不到任何引用资料或文章来解释为什么它如此熟练。有谁知道有任何内容可以解释这一点吗?
问这个问题的目的是为了更好地了解 IEnumerable 在幕后所做的事情。如果您可以向我提供任何链接,我将进行研究并发布答案。
最佳答案
IEnumerable<T>
是一个由List<T>
实现的接口(interface)。我怀疑你听到这个的原因 IEnumerable<T>
应该使用它是因为它的接口(interface)要求限制较少。
例如,考虑以下方法签名:
void Output(List<Foo> foos)
{
foreach(var foo in foos) { /* do something */ }
}
此方法要求向其传递 List 的具体实现。但它只是按顺序做一些事情。它实际上并不需要随机访问或 List<T>
所需要的任何其他东西。甚至是IList<T>
给它。相反,该方法应该接受 IEnumerable<T>
:
void Output(IEnumerable<Foo> foos)
{
foreach(var foo in foos) { /* do something */ }
}
现在我们使用最通用(最不具体)的接口(interface)来支持我们需要的操作。这是面向对象设计的一个基本方面。我们只需要我们需要的东西,而不需要太多其他东西,从而减少了耦合。我们还创建了一种更灵活的方法,因为 foos
参数可能是Queue<T>
,一个List<T>
,任何实现 IEnumerable<T>
。我们不会强制调用者将其数据结构转换为不必要的列表。
所以不是那样IEnumerable<T>
在“性能”或“运行时”方面比列出的效率更高。就是那个IEnumerable<T>
是一种更高效的设计构造,因为它更具体地指示您的设计需求。 (尽管这在特定情况下可能会导致运行时间增加。)
关于generics - 解释为什么 IEnumerable 比 List 更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347172/