提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
以.NET Framework 2.0 System.Collections中类为例
System.Collections. IEnumerable
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
System.Collections.ICollection
public interface ICollection : IEnumerable
{
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo(Array
array, int index);
}
System.Collections.IEnumerator
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
System.Collections.Stack
public class Stack : ICollection, ICloneable
{
private Object[] _array; // Storage for stack elements
private int _size;
public virtual IEnumerator GetEnumerator()
{
return new StackEnumerator(this);
}
}
System.Collections.StackEnumerator
private class StackEnumerator : IEnumerator, ICloneable
{
internal StackEnumerator(Stack stack)
{
//
}
public virtual Object Current
{
//
}
public virtual bool MoveNext() {
{
//
}
public virtual void Reset() {
{
//
}
}
调用程序
public class
Client
{
public static void Main()
{
Stack myStack = new Stack();
myStack.Push("Hello");
myStack.Push("World");
myStack.Push("!");
for
each (string s in myStack)
{
Console.Write(s);
}
Console.WriteLine();
Console.ReadLine();
}
}
C#的foreach语句常用来迭代可枚举的集合的元素。为了实现可枚举,一个集合必须有一个无参的GetEnumerator方法,这个方法返回一个枚举器(实现IEnumerator接口)。Stack类的GetEnumerator方法返回的StackEnumerator类就是一个枚举器。通常,枚举器的实现比较复杂,但C#引入了迭代器机制,可以简化枚举器的实现。
迭代器是一种方法、get 访问器或运算符,它通过使用 yield 关键字对数组或集合类执行自定义迭代。yield 返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。尽管您以方法的形式编写迭代器,但编译器会将其转换为一个实际上是状态机的嵌套类。只要客户端代码中的 foreach 循环继续进行,此类就会跟踪迭代器的位置。
Stack类的代码中并没有使用C#2.0的迭代器机制,使用迭代器机制,就不需要实现IEnumerator接口的StackEnumerator类,Stack类的GetEnumerator方法可以简化为:
public virtual IEnumerator GetEnumerator()
{
for (int i = _size – 1; i >= 0; --i)
{
yield return _array[i];
}
}