C#面试题更新 2026-08-05

请解释 C# 中 IEnumerator 接口在集合迭代中所扮演的角色,并说明其核心成员的作用。

技术原理C#

考察说明

考查对 C# 迭代器模式核心接口 IEnumerator 的理解及其在集合遍历中的职责。

回答思路

  1. 【回答框架 1】IEnumerator 是 C# 中迭代器模式的基础接口,提供向前遍历集合的机制。它包含三个核心成员:Current 属性返回当前元素,MoveNext() 方法将游标移动到下一个元素并返回是否成功,Reset() 方法将游标重置到初始位置。
  2. 【回答框架 2】集合类型通过实现 IEnumerable 接口的 GetEnumerator() 方法返回一个与集合类型匹配的 IEnumerator 实现。foreach 语句在编译时会被转换为对 GetEnumerator() 的调用,然后循环调用 MoveNext() 和访问 Current,直到 MoveNext() 返回 false。
  3. 【回答框架 3】在 .NET 中,IEnumerator 有泛型和非泛型两个版本。泛型版本 IEnumerator<T> 继承自 IDisposable 和 IEnumerator,提供类型安全的 Current 属性和 Dispose() 方法,用于释放迭代器持有的资源。
  4. 【回答框架 4】实现自定义集合时,可以直接实现 IEnumerator,但更推荐使用迭代器方法(yield return),编译器会自动生成实现 IEnumerator 的类,简化代码并保证正确性。
  5. 【关键点 1】IEnumerator 提供只进的迭代支持,核心成员为 Current、MoveNext() 和 Reset()。
  6. 【关键点 2】foreach 依赖 IEnumerable.GetEnumerator() 返回的枚举器进行遍历。
  7. 【关键点 3】泛型 IEnumerator<T> 继承 IEnumerator 和 IDisposable,支持资源清理并保证类型安全。
  8. 【关键点 4】编译器生成的迭代器(yield return)是便捷且安全的实现方式。
  9. 【关键点 5】Reset() 通常不推荐用于重新遍历,建议重新获取枚举器。
  10. 【易错点 1】在迭代过程中修改集合可能导致 InvalidOperationException,因为枚举器通常检查集合版本。
  11. 【易错点 2】Reset() 方法对于某些集合(如从迭代器块生成的枚举器)可能抛出 NotSupportedException。
  12. 【易错点 3】忘记释放枚举器可能导致资源泄漏,应使用 using 或让 foreach 自动调用 Dispose。