产量回报如何在c#中工作

我有以下一段代码。

public static void main(string []args)
{

  var intergers = GetCollection();

  foreach(var val in intergers)
  {
   console.writeline(val);
   }

}

public IEnumerable<int> GetCollection()
{

  yield return 10;

  var obj = new MyClass();
  obj.performLargeAction();

  yield return 1;

  var obj = new MyClass();
  obj.perform();

  yield return 2;

  console.writeline("I am finished now");  
}

现在,当我调试代码并查看foreach迭代时,我发现第一次执行方法直到yield返回10,然后控制返回到foreach循环,在yield return 10之后的下一个迭代代码中执行,直到yield return 1被执行并且在接下来的迭代中,它会在yield返回1后直接执行,直到yield返回,并在下一次迭代中调用console.writeline();

因此,有了这种行为,我很想知道.net暂停执行返回IEnumerable的方法并将其位置计数器或状态保存到堆栈,并且下一次迭代再次弹出该位置并将其设置为程序计数器或位置计数器和所有这些东西或

我已经读过yield是ac#的特性,所以上面这段代码被转换为IL,并且yield部分被一个名为YieldEnumerator的类替换,该类存储状态,当前和其他内容。 但我仍然无法理解它的实际功能。 所以,我想知道它的内部工作形式开始结束。

链接地址: http://www.djcxy.com/p/53711.html

上一篇: How yield return works in c#

下一篇: IEnumerable and Recursion using yield return