DotNet Framework源代码中的模式(三)——Iteartor(迭代器模式)

 

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

 

DotNet Framework源代码中的模式(三)——Iteartor(迭代器模式)_第1张图片

 

 

.NET Framework 2.0 System.Collections中类为例

DotNet Framework源代码中的模式(三)——Iteartor(迭代器模式)_第2张图片 

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

Code
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

Code
private class StackEnumerator : IEnumerator, ICloneable
{
    
//
    internal StackEnumerator(Stack stack)
    {
        
//
    }
    
//
    public virtual Object Current
    {
        
//
    }
    
//
    public virtual bool MoveNext() {
    {
        
//
    }
    
//
    public virtual void Reset() {
    {
        
//
    }
    
//
}

 

调用程序

Code
public class Client
{
    
public static void Main()
    {
        Stack myStack 
= new Stack();
        myStack.Push(
"Hello");
        myStack.Push(
"World");
        myStack.Push(
"!");   
        
foreach (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];
        }
    }

 

 

你可能感兴趣的:(DotNet Framework源代码中的模式(三)——Iteartor(迭代器模式))