繁体   English   中英

收益率 vs 懒惰<T>

[英]yield return vs Lazy<T>

我已经了解了收益回报的延迟执行。 现在我看到了一种在 .Net 4 中引入的类型( Lazy<T> )。 我的问题是:这些之间有什么联系吗? 我已经检查了 ILSpy 中Lazy<T>的方法,但我还没有看到带有 yield return 的方法实现。 那么它们是否在较低级别连接?

他们彼此毫无关系。

迭代器方法(使用yield return方法,例如 LINQ 方法)使用延迟执行
这意味着在您枚举其结果之前,方法中的代码不会运行。

Lazy<T>是一个包装器,它只会在第一次访问Value属性时计算其值。

不,他们没有任何关系。

yield用于在迭代期间返回指向对象的当前指针。 它在迭代大型数据集和过滤/验证......一些当代数据(在迭代期间)非常有用,所以你不需要先缓存过滤的(比如)值,因为它会使内存变得不合理地大。

懒惰,是关于延迟/延迟或延迟初始化,而不是。 这完全是关于您像这样指定的类型的实例的后期初始化。

示例:您有一个类型,它在初始化时分配了大量内存,但在您的应用程序工作流中,用户不需要该类型(某些特定的用户请求的操作)是非常常见的情况,因此您使用Lazy<T>来定义一个类型,但do not initialize ,因此仅在实际需要时才分配内存。

您可以看到这些概念之间没有任何关系。

否 - 迭代器旨在提供与Lazy<T>不同的功能。

虽然迭代器提供了一种使用延迟执行来实现IEnumerable<T>方法,并提供了一种“惰性”形式,但它们的预期用例与Lazy<T>完全不同。 Lazy<T>提供了对同一个实例进行多次获取的惰性构造函数。 另一方面,迭代器旨在评估和返回一系列值,而不是单个值。

每次调用一个用迭代器( yield return )实现的方法都会重新评估序列。

此外, Lazy<T>可以(可选)提供线程安全保证。

不是真的。 yield return用于实现返回类型为IEnumerable<T>IEnumerator<T> 由于Lazy<T>没有具有此类返回类型的方法,因此显然在其实现中未使用迭代器块。

不,两者不以任何方式使用或相互依赖。

使用yield return不会使用Lazy<T>

Lazy<T>是延迟生产一些昂贵的数据,直至(或即使)实际需要。

你可以回复它说“如果你真的需要这些数据,我可以去生产它,但如果你不需要它,我们已经节省了一些时间”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM