foreach循环如何解释收益率回报?

时间:2014-02-02 06:38:05

标签: c#

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(属性)。

1 个答案:

答案 0 :(得分:5)

编译器创建一个状态机,每次调用MoveNext()时都会移动到下一个状态,并通过Current属性返回当前状态的正确值。

此状态机可能是无限的(例如,当您将yield return置于无限循环内时)或finite。当它有限时,最后一个状态MoveNext()返回false让调用者知道没有更多结果。

Jon Skeet提供了很好的文章:Iterator block implementation details: auto-generated state machines