C# 收益率vs懒惰<;T>;
我已经学会了延迟执行和收益回报。现在我看到了.NET4中引入的一种类型(C# 收益率vs懒惰<;T>;,c#,.net,C#,.net,我已经学会了延迟执行和收益回报。现在我看到了.NET4中引入的一种类型(Lazy)。我的问题是:这两者之间有什么联系吗?我已经检查了ILSpy中的Lazy方法,但是我还没有看到具有收益率返回的方法实现。那么,它们是在较低的层次上连接的吗?它们之间没有任何关系 迭代器方法(使用产生返回的方法,如LINQ方法)使用延迟执行。 这意味着在枚举其结果之前,方法中的代码不会运行 Lazy是一种包装器,它仅在首次访问value属性时计算其值。否-迭代器的作用与Lazy不同 虽然迭代器提供了一种使用延迟执行实
Lazy
)。我的问题是:这两者之间有什么联系吗?我已经检查了ILSpy中的Lazy
方法,但是我还没有看到具有收益率返回的方法实现。那么,它们是在较低的层次上连接的吗?它们之间没有任何关系
迭代器方法(使用产生返回的方法,如LINQ方法)使用延迟执行。
这意味着在枚举其结果之前,方法中的代码不会运行
Lazy
是一种包装器,它仅在首次访问value
属性时计算其值。否-迭代器的作用与Lazy
不同
虽然迭代器提供了一种使用延迟执行实现IEnumerable
的方法,并提供了一种形式的“惰性”,但它们的预期用例与Lazy
截然不同<代码>惰性
为惰性构造函数提供同一实例的多个回迁。另一方面,迭代器用于计算和返回一系列值,而不是单个值
调用用迭代器(产生返回值
)实现的方法每次都将重新计算序列
另外,
Lazy
可以(可选地)提供线程安全保证。不太可能yield return
用于实现返回类型为IEnumerable
或IEnumerator
的方法。由于Lazy
没有具有此类返回类型的方法,因此在其实现中显然没有使用迭代器块。没有,这两种方法没有以任何方式使用或相互依赖
使用yield return
不会使用Lazy
惰性的要点是将一些昂贵数据的生产推迟到(甚至是在)实际需要时进行
您可以返回它,说“如果您真的需要这些数据,我可以去制作,但如果您不需要,我们已经节省了一些时间。”不,它们彼此无关
yield
用于在迭代期间返回指向对象的当前指针。它在迭代大型数据集和过滤/验证。。。有些数据是当代的(在迭代过程中),所以您不需要首先缓存过滤的(比如)值,因为这会使内存不合理地增长
Lazy是指延迟/延迟或延迟的初始化。这都是关于您指定的类型的实例的后期初始化
示例:您有一个类型,它在初始化时分配了大量内存,但在您的应用程序工作流中,用户不需要该类型(某些特定的、用户请求的操作)是非常常见的情况,因此您使用Lazy
,来定义一个类型,但不初始化它,所以只在实际需要时分配内存
您可以看到,这些概念之间没有任何关系。并且具有相似的语义。哦,理论上,每一个都可以根据另一个来实现,即使一个方向非常不切实际……所以两者都提供延迟值检索。这听起来不像是“彼此无关”,他们之间并没有直接的联系。由于产量主要用于延迟执行,因此产量要复杂一些。i、 你可能有一个循环,它调用一个可枚举函数,该函数利用了收益率,它可能会短路,并且永远不会完全释放。惰性延迟整个值加载,而不是部分延迟。重要的是,没有进一步的惰性
-类似结果缓存,收益返回
将在每次枚举时计算“其值的计算”,其中as惰性
将只计算一次。