[英]Why is IList not deferred execution?
据我所知,IEnumerable和IQueryable是延迟执行。 为什么IList不支持延迟执行呢?
我想的时间越长,我就越怀疑“延期执行”的整个想法是否实际上具有教育价值。
我会否认它来回答你的问题。 IEnumerable<T>
, IQueryable<T>
和IList<T>
不以任何方式表示“延迟”或“急切”计算。
相反, 接口表示提供服务的能力 。 IEnumerable<T>
表示服务“我可以提供T类型的一个序列,可能是无限的,一次一个”。 IQueryable<T>
表示服务“我可以代表对数据源的查询,并按需提供该查询的结果”。 IList<T>
表示服务“我可以提供对类型T的可能可变的,有限大小的项目列表的随机访问”。
这些服务都没有说明服务提供商的实施细节。 IList<T>
服务的提供者可能完全是懒惰的; IQueryable<T>
服务的提供者可能非常渴望。 如果你想做一个延迟执行的IList<T>
,你就可以了。 没有人阻止你!
IList<T>
支持通过索引器进行随机访问 - 以及Count
属性。 这两者都违背了使用流数据延迟执行的精神,除非你建议你真的只想要一些东西在你访问任何东西时加载整个列表。 如果这就是你所追求的,那么Lazy<T>
可能就是票......
正如@Joe指出的那样, IList<T>
抽象出一个名词 。 IEnumerable<T>
和IQueryable<T>
是动词的抽象。
IList<T>
是可以作为列表处理的集合的抽象。 IEnumerable<T>
和'IQueryable抽象动作:对基础集合中包含的项进行枚举或查询。
想一想你所说的话的后果。
会推迟什么,直到什么时候?
在IEnumerable
和IQueryable
的情况下,延迟的是枚举。 并且接口不会暴露任何依赖于枚举的其他内容。
有很多原因,只有一些:
IList
应独立于用于创建IList
的基础数据源 IList
成员应该是O(1) - 延迟执行这是无法保证的 - 访问可能非常慢,至少是第一次。 IList
成员不应该产生异常,因为在访问时如何构造IList
(延迟执行可能会出现各种各样的问题,想想也就是说无法访问原始数据源) - 这会回来到第一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.