C#特性 迭代器(下) yield以及流的延迟计算

2019-12-26 11:17:15王冬梅

 

复制代码
private static IEnumerable<int> WithYield()
{
    return new <WithYield>d__0(-2);
}

 

晕,怎么搞的,这是我写的代码么?我的for循环呢?经过我再三确认,确实是我写的代码生成的。我心里暗暗叫骂,编译器,你怎么能这样“无耻”,在背后修改我的代码,你这不侵权么。还给我新生成了一个类<WithYield>d__0,这个类实现了这么几个接口:IEnumerable<int>, IEnumerable, IEnumerator<int>, IEnumerator, IDisposable(好啊,这个类将枚举接口和迭代器接口都实现了) 
现在能解答测试1为什么没有输出了,调用WithYield()里面就是调用了一下<WithYield>d__0的构造方法,<WithYield>d__0的构造方法的代码:

 

 

复制代码
public <WithYield>d__0(int <>1__state)
    {
        this.<>1__state = <>1__state;
        this.<>l__initialThreadId = Thread.CurrentThread.ManagedThreadId;
    }

 

这里没有任何输出。 
在测试2中,首先我们会调用<WithYield>d__0的GetEnumerator()方法,这个方法里将一个整型局部变量<>1__state初始化为0,再看看MoveNext()方法的代码:
 

  1. private bool MoveNext()    { 
  2.     switch (this.<>1__state)      { 
  3.       case 0:          this.<>1__state = -1; 
  4.         this.<i>5__1 = 0;          goto Label_006A; 
  5.         case 1: 
  6.         this.<>1__state = -1;          goto Label_005C; 
  7.         default: 
  8.         goto Label_0074;      } 
  9.   Label_005C:      this.<i>5__1++;