【问题标题】:Reason for "yield return someObject" followed by "someObject = null"? [closed]“yield return someObject”后跟“someObject = null”的原因? [关闭]
【发布时间】:2012-09-30 07:06:18
【问题描述】:

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

yield return someObject;
someObject = null;

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

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

谢谢!

【问题讨论】:

  • 谁知道?没有上下文(具体来说,知道someObject 是类成员还是本地成员)是不可能的。
  • 谢谢,编辑了更多上下文!
  • 为什么不直接粘贴到整个方法中?

标签: c# return yield


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的解释,以及对 .NET 如何处理 yield 语句的见解!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      相关资源
      最近更新 更多