关于c#:何时返回IEnumerable<>

when to return IEnumerable<T>

本问题已经有最佳答案,请猛点这里访问。

只有在方法和属性被延迟评估的情况下,我才应该从该方法和属性返回IEnumerable

当你返回IEnumerableICollectionIList时,你们有什么模式吗?


每当调用方只需要从头到尾迭代集合时,我返回IEnumerable。通过使用尽可能最小的接口,我可以确保调用代码没有太紧密地耦合,从而更容易在以后更改方法或属性中的代码。如果它仍然返回IEnumerable,没有其他人需要关心。如果它之前返回了list,并且新方法在内部表示使用哈希集的东西,那么其他的东西也会突然发生变化。

因此,我总是倾向于返回集合接口,而不是具体的集合,除非在调用代码确实需要知道它处理的集合类型的情况下。我认为调用者需要能够执行的操作,并找到支持它们的最小接口。


通常,如果它是一个列表(不是懒惰的),我会返回i list。比如,当我的方法被期望作为集合返回结果时,我总是这样做。我这样做是因为它在方法签名中清楚地声明它是一个已加载的列表,而不是一个延迟计算的列表,但是使用接口不会公开具体的类型(数组、列表、只读列表等)。

当对传入的集合执行任何类型的转换时,返回IEnumerable(Linq方法)

同时,我在方法中使用IEnumerable作为参数,只是声明"这个函数不重要,它只需要能够通过"。当然,我确保IEnumerable在我的函数中只枚举一次。


在这些情况下,应退回IEnumerable

  • 结果不管是数组、列表还是任何类型的集合,因为使用者只需要迭代它。

  • 结果是使用IEnumerable的实现进行类型化的,但是公共API并不强制消费者使用特定于API的类型,因此消费者使用poco保持中立。

  • 如果预期结果为集合,则应返回IEnumerable的具体实现,如ICollectionIListList等。这就是消费者应该能够使用索引器访问可枚举成员,或者他们应该修改集合本身(添加、更新、删除、搜索…集合中的项)。

    为属性和返回类型选择正确的具体类型更多的是一个好的案例分析,只需输入您的消费者需要的内容。

    例如,从概念上讲,一些属性应该返回一个列表,但消费者不应该修改它,因此,这个属性应该返回一个ReadOnlyCollection,但您应该将其键入IList

    正如我上面所说,很好的案例分析并保持简单。


    如果对方法的调用方来说结果应该是只读的,则返回IEnumerable


    根据经验:

    我返回ICollection,如果我确定我总是知道返回的结果数量。如果呼叫者只是列举,他们可以很容易地将其视为一个IEnumerable。如果元素的顺序不是随机的,我使用IList。我在其他情况下使用IEnumerable。对于一个接口的不同实现,我使用"最宽松"的接口,而不是重新复制结果以满足特定的集合接口。