我有以下代码。
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 return 1之后从右边行执行,直到yield返回并在下一次迭代中执行 调用console.writeline();
所以,有了这个行为,我很想知道.net暂停执行返回IEnumerable的方法,并将其位置计数器或状态保存到堆栈,然后再次迭代弹出该位置并将其设置为程序计数器或位置计数器和所有这些东西或
我读过yield是一个c#特性,所以上面的代码转换为IL,并且yield部分被一个名为YieldEnumerator的类替换,该类存储状态,当前和其他东西。但我还是无法理解它的实际功能。所以,我想知道它的内部工作形式即将结束。