Guushuuse .NET

领域驱动设计==哲学

导航

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

 

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

 

 

 

.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

Code

 

System.Collections.StackEnumerator

Code

 

调用程序

Code

 

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];
        }
    }

 

 

posted on 2009-05-10 19:04  guushuuse  阅读(1981)  评论(1编辑  收藏  举报