我已经了解了带有收益返回的延迟执行。现在我看到了一种在 .Net 4 ( Lazy<T>
) 中引入的类型。我的问题是:这些之间有什么联系吗?我已经检查了Lazy<T>
ILSpy 中的方法,但我还没有看到带有 yield return 的方法实现。那么它们是否在较低级别连接?
5 回答
他们彼此没有任何关系。
迭代器方法(使用 的方法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>
or的方法IEnumerator<T>
。由于Lazy<T>
没有具有此类返回类型的方法,因此在其实现中显然没有使用迭代器块。
不,两者不以任何方式使用或相互依赖。
使用yield return
不会使用Lazy<T>
。
关键Lazy<T>
是将一些昂贵数据的生成推迟到(或即使)实际需要。
您可以将其退回说“如果您确实需要这些数据,我可以去制作它,但如果您不需要它,我们已经节省了一些时间”。