4

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

4

5 回答 5

7

他们彼此没有任何关系。

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

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

于 2013-06-24T16:17:16.783 回答
6

不,他们彼此没有任何关系。

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

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

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

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

于 2013-06-24T16:18:30.103 回答
5

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

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

调用使用迭代器 ( yield return) 实现的方法将每次重新评估序列。

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

于 2013-06-24T16:17:24.457 回答
1

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

于 2013-06-24T16:17:30.940 回答
1

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

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

关键Lazy<T>是将一些昂贵数据的生成推迟到(或即使实际需要。

您可以将其退回说“如果您确实需要这些数据,我可以去制作它,但如果您不需要它,我们已经节省了一些时间”。

于 2013-06-24T16:17:34.570 回答