收益率与懒惰<t> </t>

时间:2013-06-24 16:15:48

标签: c# .net

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

感谢您的回答!

5 个答案:

答案 0 :(得分:5)

他们与彼此无关。

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

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

答案 1 :(得分:3)

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

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

调用使用迭代器(yield return)实现的方法每次都会重新调整序列。

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

答案 2 :(得分:3)

不,他们彼此无关。

yield用于在迭代期间返回指向对象的当前指针。它在迭代大型数据集和过滤/验证......当前(迭代期间)的某些数据时非常有用,因此您不需要首先缓存过滤(说)值,因为它会使内存增长到不合理的大。

懒惰,是关于延迟/延迟或延迟初始化。这都是关于你指定的类型的实例的后期初始化。

示例:您有一个类型,在启动时会分配大量内存,但在应用程序工作流中很常见的情况是用户不需要该类型(某些特定的,用户请求的操作),因此您使用{{1 },定义类型,但Lazy<T>它,所以只在实际需要时才分配内存。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

Lazy<T>的目的是推迟生成一些昂贵的数据,直到(或者甚至,如果)实际需要。

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