枚举器

C# 中的枚举器

引言

foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数。数组或集合实现带GetEnumerator()方法的IEnumerable接口。GetEnumerator()方法返回一个实现IEnumerator接口的枚举。接着,foreach语句就可以使用该枚举迭代集合了。foreach语句并不真的需要在集合类中执行这个接口。只需被迭代的类有一个GetEnumerator()方法,返回实现了IEnumerator接口的对象就足够了。迭代器是 C# 2.0 中的新功能。它使您能够在类或结构中支持foreach,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerator IEnumerator CurrentMoveNext Reset 方法。

关键词

枚举器,迭代,yield

正文

1.         迭代器概述

迭代器是可以返回相同类型的值的有序序列的一段代码。 

迭代器可用作方法、运算符或 get 访问器的代码体。

迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。

可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,

可以在 foreach 语句中被客户端代码调用,如下所示:

foreach(int x in SampleClass.Iterator2){}

迭代器的返回类型必须为 IEnumerable

 

2.         示例代码

Code

分别使用MyList集合的3个的迭代器,将得到不同的结果。代码如下:

Code

运行结果如下图:

注意:GetEnemerator()方法返回IEnumerator类型,自定义枚举器是IEnumerable类型,它包含了GetEnumerator()方法。foreach语句使用枚举器时,自动调用集合的GetEnumerator()方法或自定义枚举器的GeEnumerator()方法,并使用得到的Enumerator对象遍历集合的数据结构。使用自定义枚举器时,要在foreach语句的in后面显式指定集合对象的自定义枚举器,使用默认枚举器时,in后面跟集合对象即可。

3.         yield关键字

yield关键字用于指定以枚举数对象值的形式返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。遇到yield break时终止迭代。所有的状态管理已经都为你做好了。

注意

1)     yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:

·      不允许不安全块。

·      方法、运算符或访问器的参数不能是 ref out

2)     yield 语句不能出现在匿名方法中。

3)     当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。

posted @ 2008-09-15 13:06  baofish  阅读(763)  评论(0)    收藏  举报