这里的状态机是由 C# 编译器自动生成的。C# 编译器在继续之前在内部将许多高级功能(如闭包、yield 关键字和异步)转换为简化的 C#。诸如“AsyncStateMachineAttribute”之类的事情是发生此类事情的一点证据。您可能还熟悉名为 DisplayClass923084923'1 的类,它们是 C# 为实现闭包而生成的类。
例如,当您使用“yield”时,C# 编译器首先生成一个不使用“yield”而是使用状态机实现的代码版本。原则上,从这里;
yield "A";
yield "B";
至
int _state = 0;
if (_state == 0) { state = 1; return "A"; }
if (_state == 1) { state = 2; return "B"; }
这意味着 C# 编译器以后不必像这样处理“yield” ——它已被简化为整数和 return 语句。我认为这是在IteratorStateMachineAttribute
类的简化、整数和返回版本中添加的地方。
(我认为 Async 的工作方式相同,生成一个简化的状态机作为其简化步骤,这就是您在文档中的方式。)
但是,从最早的 C# 版本开始,您就拥有了foreach
关键字,该关键字适用于任何具有GetEnumerator
方法的对象,并且该枚举器具有诸如MoveNext
和之类的方法Result
。
所以——迭代器方法可能以不同的方式产生。IteratorStateMachineAttribute
是编译器在某些情况下提供的,但你不应该依赖它在那里。