C# 迭代器模式(Iterator Pattern)全面解析:从原理到高级应用

一、迭代器模式概述

迭代器模式是一种行为设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在C#中,迭代器模式通过IEnumerableIEnumerator接口得到了原生支持,使得这种模式在.NET生态中应用极为广泛。

1.1 核心价值

迭代器模式的核心价值在于:

  1. 职责分离:将集合对象的存储职责和遍历职责分离
  2. 统一接口:为不同的集合结构提供统一的遍历接口
  3. 多态迭代:支持对同一集合实施多种遍历方式
  4. 并行遍历:允许同时进行多个独立的遍历过程

1.2 基本组成

在C#中,迭代器模式主要涉及以下组件:

  • IEnumerable/IEnumerable<T>:可枚举接口,定义获取迭代器的方法
  • IEnumerator/IEnumerator<T>:迭代器接口,定义遍历集合的基本操作
  • yield关键字:C#语法糖,简化迭代器实现

二、C#迭代器实现机制

2.1 接口定义分析

// 非泛型版本
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

public interface IEnumerator
{
    object Current { get; }
    bool MoveNext();
    void Reset();
}

// 泛型版本
public interface IEnumerable<T> : IEnumerable
{
    new IEnumerator<T> GetEnumerator();
}

public interface IEnumerator<T> : IEnumerator, IDisposable
{
    new T Current { get; }
}

2.2 yield关键字原理

当使用yield关键字实现迭代器时,C#编译器会执行以下转换:

  1. 生成一个实现了IEnumerator<T>的嵌套类(状态机)
  2. 将方法体转换为状态机代码
  3. 将局部变量提升为状态机的字段
  4. 实现MoveNext()方法,根据状态跳转到相应的yield return语句

例如以下代码:

public IEnumerable<int> GetNumbers()
{
    yield return 1;
    yield return 2;
    yield return 3;
}

编译器会生成类似如下的状态机类:

private sealed class <GetNumbers>d__0 : IEnumerable<int>, IEnumerable, IEnumerator<int>, IEnumerator
{
    private int <>1__state;
    private int <>2__current;
    
    int IEnumerator<int>.Current => <>2__current;
    object IEnumerator.Current => <>2__current;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值