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

标签 c# ienumerable ilist n-tier-architecture

首先,我不认为这个问题是这些 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/

相关文章:

c# - 计算一条线的精确像素

c# - 如何拦截来自 C# 客户端 Web 代理的出站和入站 Soap 消息

c# - 为复合模式的叶节点实现 IEnumerable

.net - IEnumerable 为空?

c# - 使用 IEnumerable 与 ICollection 与 IList 的自定义集合

c# - IList.Add() 覆盖现有数据

c# - 两个列表同步

c# - C#中如何判断组合框中的项目是否被选中?

c# - 这些枚举代码的功能相同吗?

c# - MVC 路由 : How to map two names to one action