.Net 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

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

      }

}

时间: 2024-12-26 23:30:05

.Net Framework源代码中的模式之Iteartor(迭代器模式)的相关文章

DotNet Framework源代码中的模式(一)——目录

DotNet Framework源代码中的模式(二)--前言 DotNet Framework源代码中的模式(三)--Iteartor(迭代器模式) DotNet Framework源代码中的模式(四)--Abstract Factory(抽象工厂模式) DotNet Framework源代码中的模式(五)--Decorator(装饰模式) DotNet Framework源代码中的模式(六)--Prototype(原型模式) DotNet Framework源代码中的模式(七)--Factor

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

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 以.NET Framework 2.0 System.Collections中类为例 System.Collections. IEnumerable public interface IEnumerable { IEnumerator GetEnumerator(); } System.Collections.ICollection public interface ICollection : IEnumerable {

DotNet Framework源代码中的模式(二)——前言

随着Visual Studio 2008的发布,微软根据MS-RL协议向开发人员提供了.NET Framework的源代码,包括基础类库 (BCL). ASP.NET. WinForms和WPF等代码..NET Framework是.NET平台的基础架构,它的开放源代码,为开发人员更加深入研究.NET 技术细节提供了极大便利,也为开发人员如何构建一个优秀的软件开发框架提供了很好借鉴. 构建一个优秀的软件开发框架,必然会使用设计模式..NET Framework作为一个优秀的软件开发框架,设计模式

.Net Framework源代码中的模式前言

随着Visual Studio 2008的发布,微软根据MS-RL协议向开发人员提供了.NET Framework的源代码,包括基础类库 (BCL). ASP.NET. WinForms和WPF等代码..NET Framework是.NET平台的基础架构,都开放源代码,为开发人员更加深入研究.NET 技术细节提供了极大便利,也为开发人员如何构建一个优秀的软件开发框架提供了很好借鉴. 构建一个优秀的软件开发框架,必然会使用设计模式..NET Framework作为一个优秀的软件开发框架,设计模式无

DotNet Framework源代码中的模式(八)——Builder(生成器模式)

将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表述. 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造.一般而言,此接口独立于应用程序的商业逻辑.模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色.具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法. 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例.这个角色主要完

.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable { } System.Collections. ICloneable public interface ICloneable { object Clone(); } System.Collect

.Net Framework源代码中的模式之Abstract Factory(抽象工厂模式)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 以.NET Framework 2.0 System.Data中类为例. 通过使用DbProviderFactory,只需要修改配置文件,就可以实现不同数据库访问的目的. System.Data.Common.DbProviderFactory public abstract class DbProviderFactory {   public virtual DbConnection CreateConnection() {

.Net Framework源代码中的模式之Decorator(装饰模式)

动态地给一个对象添加一些额外的职责.就扩展功能而言,Decorator模式比生成子类方式更为灵活. 以.NET Framework 2.0 System.IO中类为例. System.IO.Streampublic abstract class Stream : MarshalByRefObject, IDisposable{ public abstract int Read([In, Out] byte[] buffer, int offset, int count); public abst

一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)

用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 以.NET Framework 2.0 System.Collections中类为例. System.Collections. ICollection public interface ICollection : IEnumerable{} System.Collections. ICloneable  public interface ICloneable{ object Clone();} System.Collection