C#$2.0-迭代器应用[4]
终极管理员 知识笔记 122阅读
C# 2.0编译器和迭代如果你是一个好奇的开发者,你可能会很高兴看到C # 2.0在编译和解释yield break和yield return关键字方面所做的工作。这
是本节的主题。请注意迭代器是作为语法出现的不像范型,没有IL指令集被添加作为实现迭代。
![C#$2.0-迭代器应用[4]](https://www.feiniaomy.com/xzm_artimg/230915210226kq64354906_0.png)
使用编译器自动创建枚举器类
一个至少包含一个yield break或yield return关键字的方法必须返回一个枚举或枚举器(范型实现或不是)类型。无论如何,你应该考虑的是一个被返回的枚举器对象应该是一个实现了枚举接口并返回一个枚举器类型的实现。如果你读过前面的关于匿名方法的文章,那么你可能已经猜到对于每一个至少包含一个yield break或yield return关键字的方法,编译器为其构建出一种词法环境。如果方法返回了一个枚举对象那么这个创建的类中实现了System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<T> 以及 System.Collections接口。此外,这个方法不能直接编译。让我们看一个例子:
![C#$2.0-迭代器应用[4]](https://www.feiniaomy.com/xzm_artimg/230915210226kq64354906_1.png)
using System;
using System.Collections.Generic;
class AClass
{
public Ienumerable<string> AnIterateur()
{
yield return “str1”;
yield return “str2”;
yield return “str3”;
}
}
class Program
{
static void Main(string[] args)
{
AClass collec = new AClass();
foreach ( string s in collec.AnIterateur())
{
Console.WriteLine(s);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
class AClass
{
public Ienumerable<string> AnIterateur()
{
yield return “str1”;
yield return “str2”;
yield return “str3”;
}
}
class Program
{
static void Main(string[] args)
{
AClass collec = new AClass();
foreach ( string s in collec.AnIterateur())
{
Console.WriteLine(s);
Console.ReadLine();
}
}
}
接着我们使用了Reflector查看编译后的配件:
为了看的更清楚,我们反编译了Main()方法。接着我们会看到一个名为<AnIteratuer>d_0类实例被创建。在前面的论述中我们提过一个匿名方法是某种封闭(Closure)的实例。而C#2.0的迭代器就是一种特殊的封闭类型。
标签: