Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收益率vs懒惰<;T>;_C#_.net - Fatal编程技术网

C# 收益率vs懒惰<;T>;

C# 收益率vs懒惰<;T>;,c#,.net,C#,.net,我已经学会了延迟执行和收益回报。现在我看到了.NET4中引入的一种类型(Lazy)。我的问题是:这两者之间有什么联系吗?我已经检查了ILSpy中的Lazy方法,但是我还没有看到具有收益率返回的方法实现。那么,它们是在较低的层次上连接的吗?它们之间没有任何关系 迭代器方法(使用产生返回的方法,如LINQ方法)使用延迟执行。 这意味着在枚举其结果之前,方法中的代码不会运行 Lazy是一种包装器,它仅在首次访问value属性时计算其值。否-迭代器的作用与Lazy不同 虽然迭代器提供了一种使用延迟执行实

我已经学会了延迟执行和收益回报。现在我看到了.NET4中引入的一种类型(
Lazy
)。我的问题是:这两者之间有什么联系吗?我已经检查了ILSpy中的
Lazy
方法,但是我还没有看到具有收益率返回的方法实现。那么,它们是在较低的层次上连接的吗?

它们之间没有任何关系

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


Lazy
是一种包装器,它仅在首次访问
value
属性时计算其值。

否-迭代器的作用与
Lazy
不同

虽然迭代器提供了一种使用延迟执行实现
IEnumerable
的方法,并提供了一种形式的“惰性”,但它们的预期用例与
Lazy
截然不同<代码>惰性
为惰性构造函数提供同一实例的多个回迁。另一方面,迭代器用于计算和返回一系列值,而不是单个值

调用用迭代器(
产生返回值
)实现的方法每次都将重新计算序列


另外,
Lazy
可以(可选地)提供线程安全保证。

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

没有,这两种方法没有以任何方式使用或相互依赖

使用
yield return
不会使用
Lazy

惰性的要点是将一些昂贵数据的生产推迟到(甚至是在)实际需要时进行


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

不,它们彼此无关

yield
用于在迭代期间返回指向对象的当前指针。它在迭代大型数据集和过滤/验证。。。有些数据是当代的(在迭代过程中),所以您不需要首先缓存过滤的(比如)值,因为这会使内存不合理地增长

Lazy是指延迟/延迟或延迟的初始化。这都是关于您指定的类型的实例的后期初始化

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


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

并且具有相似的语义。哦,理论上,每一个都可以根据另一个来实现,即使一个方向非常不切实际……所以两者都提供延迟值检索。这听起来不像是“彼此无关”,他们之间并没有直接的联系。由于产量主要用于延迟执行,因此产量要复杂一些。i、 你可能有一个循环,它调用一个可枚举函数,该函数利用了收益率,它可能会短路,并且永远不会完全释放。惰性延迟整个值加载,而不是部分延迟。重要的是,没有进一步的
惰性
-类似结果缓存,
收益返回
将在每次枚举时计算“其值的计算”,其中as
惰性
将只计算一次。