1

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

yield return someObject;
someObject = null;

我看到了这个并认为这很奇怪,所以我想知道是否有人知道这是否会比让 someObject 坐在那里作为分配的内存获得某种收益。需要明确的是,有问题的行是第二条语句,因为收益率回报相当普遍。将延迟返回对象设置为 null 是我的问题。

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

谢谢!

4

3 回答 3

2

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

所以这条线完全没用,实际上可以让对象存活更长时间。在大多数情况下,它只是代码生成器发出的无害代码,就像基里尔所说的那样。

然而——当编译器遇到闭包或协程(yield return创建一个协程)时,局部变量会被提升为辅助类的成员。而且班员不能提前集合。因此,null可能需要分配以使其无法访问。

于 2012-10-09T22:20:44.223 回答
0

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

于 2012-10-09T21:32:44.700 回答
0

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

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

于 2012-10-09T22:04:09.143 回答