.Net2.0如何实现GetEnumerator()方法

 用yield关键字构建迭代器方法

在以前,如果我们希望构建支持foreach枚举的自定义集合(如Garage),只能实现IEnumerable接口(可能还有IEnumerator接口)。然而,从.NET 2.0发布以来,还可以通过迭代器来构建使用foreach的类型。

简单来说,迭代器就是这样一个成员方法,它指定了容器内部项被foreach处理时该如何返回。虽然迭代器方法还是必须命名为GetEnumerator(),返回值还是必须为IEnumerator类型,但自定义类不需要实现原来那些接口了:

public class Garage
{
private Car[] carArray = new Car[4];
...
// 迭代器方法。
public IEnumerator GetEnumerator()
{
foreach (Car c in carArray)
{
yield return c;
}
}
}

注意,这个GetEnumerator()的实现使用内部foreach逻辑迭代每个子项,使用新的yield返回语法向调用方返回每个Car对象。yield关键字用来向调用方foreach指定返回值。当到达yield返回语句后,当前位置被存储下来,下次调用迭代器时会从这个位置开始执行。

迭代器方法不一定要通过foreach关键字来返回内容。我们也可以如下定义迭代器方法:

public IEnumerator GetEnumerator()
{
yield return carArray[0];
yield return carArray[1];
yield return carArray[2];
yield return carArray[3];
}
在这个实现中,注意GetEnumerator()方法显式返回新的值给调用者。虽然对于这个示例来说意义不是很大,因为如果我们为carArray成员变量增加更多对象的话,GetEnumerator()方法就不会同步。但是,如果我们希望方法返回能被foreach语法处理的局部数据,这个语法就很有用。

posted @ 2009-07-29 13:14  小y  阅读(2963)  评论(0编辑  收藏  举报