“yield return someObject”后跟“someObject = null”的原因?

时间:2012-10-09 21:29:09

标签: c# return yield

有谁知道以下代码背后的原因是什么?这是在VS2010中通过Web测试生成的。

yield return someObject;
someObject = null;

我看到了这一点,并认为它很奇怪,所以我想知道是否有人知道这是否会导致某些收益超过让某些对象作为已分配的内存。需要明确的是,有问题的行是第二个陈述,因为收益率回报相当普遍。将延迟返回对象设置为null是我的错误。

编辑:更多背景。 “yield return”在返回IEnumerable的方法中执行,这导致延迟执行。 someObject是一个方法范围的变量。

谢谢!

3 个答案:

答案 0 :(得分:2)

.NET非常擅长确定何时不再使用局部变量,并且即使在变量仍在范围内时,引用的对象即使在方法中也变得可收集,只要编译器可以证明它将不会再次访问。 .NET中的对象生存期与范围无关。

因此该线路完全无用,实际上可能会使对象保持更长时间。在大多数情况下,它只是代码生成器发出的无害代码,就像Kirill说的那样。

但是 - 当编译器遇到闭包或协程(yield return创建一个协同例程)时,局部变量会被提升为辅助类的成员。并且不能及早收集班级成员。因此,可能需要分配null才能使其无法访问。

答案 1 :(得分:0)

也许它与包含方法的延迟执行有关?由于你必须屈服于IEnumerable结果,我们可以假设有一些延迟执行。

答案 2 :(得分:0)

一旦这是生成代码,很可能这是"非优雅代码"在其他地方。生成的代码因具体情况而异。这意味着检查它比人工编写的代码更难。

我很容易想象,在其他可能更复杂的场景中,这一点很重要。在这里,这只是一条无用的线路,不会伤害任何人......

相关问题