Inside.Net

自由与繁荣的国度

博客园 首页 新随笔 联系 订阅 管理
  12 Posts :: 0 Stories :: 29 Comments :: 0 Trackbacks

公告

C# 2.0编译器和迭代

如果你是一个好奇的开发者,你可能乐意看到C# 2.0编译解释yield breakyield return关键字所作的工作。这是本节的主题。请注意迭代器是作为语法出现的不像范型,没有IL指令集被添加作为实现迭代。

 

使用编译器自动创建枚举器类

    一个至少包含一个yield breakyield return关键字的方法必须返回一个枚举或枚举器(范型实现或不是)类型。无论如何,你应该考虑的是一个被返回的枚举器对象应该是一个实现了枚举接口并返回一个枚举器类型的实现。如果你读过前面的关于匿名方法的文章,那么你可能已经猜到对于每一个至少包含一个yield breakyield return关键字的方法,编译器为其构建出一种词法环境。如果方法返回了一个枚举对象那么这个创建的类中实现System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<T> 以及 System.Collections接口。此外,这个方法不能直接编译。让我们看一个例子:

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();
}

  }

}


接着我们使用了Reflector查看编译后的配件:


    为了看的更清楚,我们反编译了Main()方法。接着我们会看到一个名为<AnIteratuer>d_0类实例被创建。在前面的论述中我们提过一个匿名方法是某种封闭(Closure)的实例。而C#2.0的迭代器就是一种特殊的封闭类型。

posted on 2005-04-07 20:05 Bluefee.Net 阅读(...) 评论(...) 编辑 收藏