一、迭代器模式概述
迭代器模式是一种行为设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在C#中,迭代器模式通过IEnumerable和IEnumerator接口得到了原生支持,使得这种模式在.NET生态中应用极为广泛。
1.1 核心价值
迭代器模式的核心价值在于:
- 职责分离:将集合对象的存储职责和遍历职责分离
- 统一接口:为不同的集合结构提供统一的遍历接口
- 多态迭代:支持对同一集合实施多种遍历方式
- 并行遍历:允许同时进行多个独立的遍历过程
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#编译器会执行以下转换:
- 生成一个实现了
IEnumerator<T>的嵌套类(状态机) - 将方法体转换为状态机代码
- 将局部变量提升为状态机的字段
- 实现
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;

最低0.47元/天 解锁文章
1372

被折叠的 条评论
为什么被折叠?



