yield return
循环如何解释foreach
?
foreach
循环看起来像这样:
var tmp = obj.GetEnumerator();
int i; // up to C# 4.0
while(tmp.MoveNext()) {
int i; // C# 5.0
i = tmp.Current;
{...} // your code
}
据我所知,编译器必须以某种方式用yield return
替换MoveNext()
&来自IEnumerable / IEnumerable接口的Current
(属性)。
答案 0 :(得分:5)
编译器创建一个状态机,每次调用MoveNext()
时都会移动到下一个状态,并通过Current
属性返回当前状态的正确值。
此状态机可能是无限的(例如,当您将yield return
置于无限循环内时)或finite。当它有限时,最后一个状态MoveNext()
返回false
让调用者知道没有更多结果。
Jon Skeet提供了很好的文章:Iterator block implementation details: auto-generated state machines。