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

请解释 C# 中可迭代对象的定义,并说明实现可迭代对象的具体方法有哪些?

编码实现技术原理C#

考察说明

考查对 C# 迭代器模式及 IEnumerable/IEnumerator 接口的理解与实现能力。

回答思路

  1. 【回答框架 1】可迭代对象指实现了 IEnumerable 或 IEnumerable<T> 接口的类型,其核心是提供 GetEnumerator 方法返回 IEnumerator 或 IEnumerator<T>,使对象支持 foreach 遍历。
  2. 【回答框架 2】实现方式一:手动实现 IEnumerable 和 IEnumerator,需在 GetEnumerator 中返回自定义枚举器,枚举器需实现 Current、MoveNext 和 Reset 方法,适合需要精细控制迭代状态的场景。
  3. 【回答框架 3】实现方式二:使用 yield return 关键字,编译器自动生成状态机实现迭代器,代码简洁,适合大多数场景,注意 yield break 用于提前终止迭代。
  4. 【回答框架 4】实现方式三:对于集合类,可继承 Collection<T> 或 List<T> 等现成集合,它们已实现 IEnumerable,直接复用即可。
  5. 【回答框架 5】迭代器是惰性求值的,每次 MoveNext 时才执行到下一个 yield 语句,因此适合处理大数据流或无限序列,但需注意延迟执行可能带来的副作用。
  6. 【关键点 1】可迭代对象必须实现 IEnumerable 或 IEnumerable<T> 接口。
  7. 【关键点 2】yield return 是简化迭代器实现的主要方式,编译器自动生成状态机。
  8. 【关键点 3】foreach 循环本质是调用 GetEnumerator 并循环 MoveNext 和 Current。
  9. 【关键点 4】迭代器是惰性执行的,遍历时才计算下一个元素。
  10. 【易错点 1】不要混淆 IEnumerable 和 IEnumerator,前者是可迭代对象,后者是迭代器状态。
  11. 【易错点 2】使用 yield 时,若在迭代过程中修改集合,可能引发 InvalidOperationException。
  12. 【易错点 3】Reset 方法在迭代器中通常不受支持,调用会抛出 NotSupportedException。