首先,我不认为这个问题是这些 SO 问题的重复:
Should I always return IEnumerable<T> instead of IList<T>? 和 IEnumerable<T> as return type
众所周知,引入多层的主要目的之一是减少耦合。
我们必须为数据访问定义一些接口(interface),我们的 BL 不应该关心 DAL 实现的细节。如果提到接口(interface)返回 IEnumerable<T>
BL不知道是不是只是静态IEnumerable
或者延迟执行的东西。同时,这个特定的细节可能会显着影响性能,并且需要根据实现情况进行不同的编码。
好吧,可以调用.ToList()
对于每个 IEnumerable
在我们要多次迭代收集的情况下。但是由于不必要的新列表实例化,这会降低静态集合的性能。
所以我想了解哪种方法更好。
更通用但性能可能更低 vs 更耦合——性能更高。
我想,没有 Elixir ,但可能是我错过的其他方法。
最佳答案
So I'm trying to understand which approach is better: more universal and less performant vs more coupled and more performant.
首先,虽然这是一个有趣的权衡,但在这种情况下,我认为相关的权衡实际上是正确与不正确,这肯定胜过任何性能问题。延迟执行查询通常具有这样的属性,它可以为您提供最新查询结果,而调用 ToList
则可以为您提供快照 过去版本的查询结果。肯定存在一个正确而另一个不正确的情况。
其次,假设您已经处理了正确性问题并且确实需要做出性能权衡,那么您实际想要做出的权衡是:更通用和 Not Acceptable 性能与更耦合和< strong>可接受的性能,此时很明显您必须选择性能可接受的那个。
如果两者都具有可接受的性能并且一个比另一个慢几纳秒,或者比另一个消耗多几个字节的内存,并且两者都是正确的,那么谁在乎你选择哪个?把宝贵的时间花在思考其他事情上。如果两者都没有可接受的性能,那么您就有更大的问题需要解决。
关于c# - IEnumerable<T> 作为返回值,延迟执行和 N 层应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14566386/