IEnumerable <T>作为返回值,延迟执行和N层应用程序

Pav*_*nin 5 c# ienumerable ilist n-tier-architecture

首先,我不认为这个问题是这些问题的重复:

我应该总是返回IEnumerable <T>而不是IList <T>吗?IEnumerable <T>作为返回类型

众所周知,引入几层的主要目的是减少耦合.
我们必须为数据访问定义一些接口,我们的BL不应该关心DAL实现的细节.如果提到接口返回IEnumerable<T>BL不知道它只是一个静态IEnumerable还是延迟执行的东西.同时,该特定细节可以显着影响性能并且根据实施方式需要不同的编码.
好吧,在我们要多次迭代收集的情况下,可以调用.ToList()每个IEnumerable.但是由于不必要的新列表实例化,这降低了静态集合的性能.

所以我试图了解哪种方法更好.
更具普遍性,可能性能更差,性能更高,性能更高.我想,没有银弹,但它可能是我错过的其他方法.

Eri*_*ert 8

因此,我试图了解哪种方法更好:更普遍,性能更低,更具耦合性和更高性能.

首先,虽然这是一个有趣的权衡,但在这种情况下,我认为相关的权衡实际上是正确的与不正确的,这肯定胜过任何性能问题.延迟执行查询通常具有以下属性:它为您提供查询的最新结果,而调用则为ToList您提供查询结果的过去版本的快照.肯定有一个是正确的,另一个是不正确的.

其次,假设您已经处理了正确性问题并且确实需要进行性能权衡,那么您实际需要做出的权衡是:更具普遍性和不可接受的性能与更加耦合和可接受的性能相比,此时您已经明白选择性能可接受的.

如果两者都具有可接受的性能并且一个比另一个慢几纳秒,或者比另一个消耗更多的内存,并且两者都是正确的,那么谁在乎你选择哪一个?花费宝贵的时间思考别的事情.如果两者都没有可接受的性能,那么你有一个更大的问题需要解决.


Ser*_*rvy 2

从概念上讲,如果调用者知道方法的返回类型是 aList而不是 an很重要IEnumerable(例如,知道多次迭代不会产生负面后果),那么您应该返回 a List。相反,返回接口的目的是在表达“实现是什么并不重要”。如果实现确实很重要,那么就不要使用该接口(在特定情况下)。