在 C# 中,IEnumerable 与 IEnumerator 接口各自承担什么职责?它们之间是如何协作以实现集合的遍历的?
考察说明
考查对 C# 集合遍历机制中两个核心接口职责与协作关系的理解。
回答思路
- 【回答框架 1】IEnumerable 是一个声明式接口,表示集合具备可枚举的能力,核心成员是 GetEnumerator 方法,该方法返回一个 IEnumerator 对象。它通常被 foreach 循环或 LINQ 操作作为遍历的起点。
- 【回答框架 2】IEnumerator 是一个状态机接口,负责实际的迭代过程,核心成员是 Current 属性(获取当前元素)和 MoveNext 方法(推进到下一个元素,并返回是否成功)。它维护了遍历的当前位置。
- 【回答框架 3】二者联系:IEnumerable 通过 GetEnumerator 暴露 IEnumerator,IEnumerator 是遍历的执行者。foreach 循环会先调用 GetEnumerator 获得 IEnumerator,然后循环调用 MoveNext 并访问 Current,直到 MoveNext 返回 false。
- 【回答框架 4】区别:IEnumerable 侧重于集合的可遍历性,是静态描述;IEnumerator 侧重于遍历的动态状态,包含当前元素和推进逻辑。IEnumerable 适合作为方法参数和返回值,IEnumerator 通常不直接暴露给外部消费者。
- 【回答框架 5】在 C# 中,yield return 语法会自动编译成实现 IEnumerator 的状态机,简化了自定义迭代器的编写。
- 【关键点 1】IEnumerable 是工厂,提供 GetEnumerator;IEnumerator 是迭代器,提供 Current 与 MoveNext。
- 【关键点 2】foreach 依赖 IEnumerable 获取 IEnumerator 来推动遍历。
- 【关键点 3】IEnumerable 是不变容器能力的抽象,IEnumerator 是可变遍历状态的载体。
- 【关键点 4】yield return 可隐式生成 IEnumerator 实现。