c#中Iterator的实现和其他
2021-03-08 04:29
标签:soft member evb 编译 count 复杂 await exp next 原文地址在这里。 迭代器,Iterator很多语言中都有的概念,对应C#中比如 C#中的Iterator是一个复杂的语法糖,在定义一个Iterator时,一般通过一个含有 这背后的思想是,这个 比如如下代码中, 编译器会将 其中: 实际的逻辑,就写在 这种内部类的方法,相比较递归方式,更节省栈空间,因为类是分配在堆上的。 这种通过 c#中Iterator的实现和其他 标签:soft member evb 编译 count 复杂 await exp next 原文地址:https://www.cnblogs.com/mosakashaka/p/12804832.html
虽然是很老的文章,但是这个博客内容里,有很多很有用的内容。前言
IEnumerable
类。yield return
的函数来实现。Iterator
以及和它有关的变量,都被编译器封装在了一个Helper类中,在这个Helper类中,还会维护一个State
状态变量,维护当前Iterator上次使用的状态。说明
CountFrom
返回一个从start
到limit
的int型iterator。class MyClass {
int limit = 0;
public MyClass(int limit) {
this.limit = limit;
}
public IEnumerable
CountFrom
转换为一个Helper类,而其内部有一个状态机: class MyClass_Enumerator: IEnumerable {
int state$0 = 0; // internal member
int current$0; // internal member
MyClass this$0; // implicit parameter to CountFrom
int start; // explicit parameter to CountFrom
int i; // local variable of CountFrom
public int Current {
get {
return current$0;
}
}
public bool MoveNext()
{
switch (state$0) {
case 0:
goto resume$0;
case 1:
goto resume$1;
case 2:
return false;
}
resume$0: ;
for (i = start; i CountFrom(int start)
{
MyClass_Enumerator e = new MyClass_Enumerator();
e.this$0 = this;
e.start = start;
return e;
}
start$0
,current$0
是内部变量维护start
和i
是实际遍历使用的变量state$0
和resume$0/1/..
维护了当前iterator的执行状态,有执行过程中,执行开始,执行结束
yield return
,那么相应的状态result$n
也会增加MyClass_Enumerator
类的MoveNext
中,每次向前取值后,通过Current
返回当前值。
下次再次进入时,由于内部类保证了状态,可以从上一次开始继续取值。其他补充
yield return
+状态机的思想,也是后面c#异步编程async await
等的一种思想。
通过一个helper类,记录之前的状态,下次进入直接从之前的状态执行