在foreach语句中使用枚举,可以迭代集合中的元素,且不需要知道集合中的元素个数。foreach语句使用了一个枚举器。
注:
GetEnumerator()方法用IEnumerable接口定义。foreach语句并不需要在集合类中实现这个接口。有一个名为GetEnumerator()的方法,它返回实现了IEnumerator接口的对象就够了。
IEnumerator接口
foreach语句使用IEnumerator接口的方法和属性,迭代集合中所有的元素。为此,IEnumerator定义了Current属性,来返回光标所在的元素,该接口的MoveNext()方法移动到集合的下一个元素上。如果有这个元素,该方法返回true。如果集合不再有更多的元素,该方法就返回false。
这个接口的泛型版本IEnumerator<T>派生自接口IDisposable,因此定义了Dispose()方法,来清理给枚举器分配的资源。
注:
IEnumerator接口还定义了Reset()方法,以与COM交互操作。许多.NET枚举器通过抛出NotSupportedException类型的异常,来实现这个方法。
foreach语句
C#的foreach语句不会解析为IL代码中的foreach语句。C#编译器会把foreach语句转换为IEnumerator的方法和属性。下面是一条简单的foreach语句,它迭代persons数组中的所有元素,并逐个显示它们:
List<Person> persons = new List<Person> {
new Person("Damon","Hill"),
new Person("Niki","Lauda"),
new Person("Ayrton","Senna"),
new Person("Graham","Hill")
};
//foreach语句会解析为下面的代码段。首先,调用GetEnumerator()方法。获得数组的一个枚举器。在While循环中——只要MoveNext()返回true,
//就用Current属性访问数组中的元素:
IEnumerator<Person> enumerator = persons.GetEnumerator();
while(enumerator.MoveNext()){
Person person= enumerator.Current;
System.Console.WriteLine(person);
}
yield语句
自C#的第1个版本以来,使用foreach语句可以轻松地迭代集合。在C#1.0中,创建枚举器仍需要做大量的工作。C#2.0添加了yield语句,以便于创建枚举器。yield return语句返回集合的一个元素