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

请解释在 C# 编程中,yield 关键字用于实现自定义迭代器的具体用法,并指出使用它时需要注意哪些关键点?

编码实现技术原理C#

考察说明

考查对 C# 迭代器机制(yield)的理解及其实际应用中的陷阱。

回答思路

  1. 【回答框架 1】yield 是 C# 中用于简化迭代器实现的语法糖,它允许在方法或属性中返回 IEnumerable 或 IEnumerator 类型。编译器会生成一个状态机,每次 MoveNext 执行到 yield return 暂停并返回当前值,下次继续执行。
  2. 【回答框架 2】自定义迭代器的方法可包含多个 yield return 顺序产生序列,也可用 yield break 提前终止。注意迭代器方法是惰性的,仅在 foreach 或手动调用 GetEnumerator 后执行。
  3. 【回答框架 3】注意事项包括:迭代器方法不能有 out/ref 参数,不能出现在匿名方法或 unsafe 块中;yield return 不能放在 try-catch 的 catch 块内,但可放在 try-finally 的 try 块,finally 会在迭代结束时执行;在迭代期间修改集合可能导致异常,需在实现时考虑线程安全或使用快照。
  4. 【回答框架 4】实现时需权衡:yield 简化了代码但牺牲了某些性能(如堆分配),对于极度追求性能的场景可手动实现 IEnumerator。此外,延迟执行可能导致资源释放延迟,应确保及时 Dispose 迭代器(如 using 语句)。
  5. 【关键点 1】yield 编译为状态机,支持惰性求值
  6. 【关键点 2】方法中可用多个 yield return 和 yield break
  7. 【关键点 3】迭代器中禁止 out/ref、catch 中 yield return、匿名方法等
  8. 【关键点 4】yield 简化代码但引入额外开销,注意资源释放
  9. 【关键点 5】修改集合需要谨慎处理并发问题
  10. 【易错点 1】在 catch 块内使用 yield return 会导致编译错误
  11. 【易错点 2】无限迭代器可能造成死循环,需提供退出条件
  12. 【易错点 3】延迟执行可能使异常抛出时机延后,需注意调试