我正在尝试了解迭代器如何在内部工作,以减轻我对线程安全性的某些担忧。让我们考虑例如以下简单的迭代器:
using System.Collections.Generic;
public class MyClass
{
public static IEnumerable<int> MyMethod()
{
yield return 10;
yield return 20;
yield return 30;
}
}
我可以看到将代码复制粘贴到SharpLab.io之后在后台创建的编译器生成的状态机。这是一个实现接口IEnumerable<int>
和IEnumerator<int>
的类,并且包含以下MoveNext
方法:
MoveNext
标识符private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = 10;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>2__current = 20;
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
<>2__current = 30;
<>1__state = 3;
return true;
case 3:
<>1__state = -1;
return false;
}
}
和<>1__state
是此类的私有字段:
<>2__current
我注意到此代码中的一个模式。首先,private int <>1__state;
private int <>2__current;
字段的值恢复为-1,然后将<>1__state
分配给下一个迭代值,然后将<>2__current
推进到下一个状态。我的问题是:<>1__state
行的目的是什么?我编译了这段代码(在痛苦地重命名了所有非法标识符之后)并确认可以注释掉这一行而不会影响该类的功能。我不相信C#编译器团队会忘记这条看起来毫无意义的代码。当然,它的存在必定有一个目的,我想知道这个目的是什么。