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

在 C# 中,为了让一个自定义集合能够配合 foreach 语句进行遍历,通常需要实现哪些接口或模式?请说明其关键实现要点和方法。

技术原理C#

考察说明

考察对 C# 中 foreach 迭代机制及自定义集合实现方式的理解。

回答思路

  1. 【回答框架 1】foreach 遍历依赖于集合实现 IEnumerable 或 IEnumerable<T> 接口,核心是提供 GetEnumerator 方法返回一个枚举器。
  2. 【回答框架 2】枚举器对象需要实现 IEnumerator 或 IEnumerator<T> 接口,包含 Current 属性、MoveNext 方法,并通常实现 IDisposable 用于资源清理。
  3. 【回答框架 3】可采用 yield return 简化实现,编译器会自动生成状态机完成枚举器逻辑,减少样板代码。
  4. 【回答框架 4】若集合需要支持索引访问或修改,可同时实现 ICollection 或 IList 接口,但 foreach 仅要求 IEnumerable。
  5. 【回答框架 5】自定义泛型集合建议实现 IEnumerable<T> 以获得类型安全和更好的性能,避免装箱。
  6. 【关键点 1】实现 IEnumerable<T> 并返回 IEnumerator<T> 枚举器
  7. 【关键点 2】使用 yield return 可快速实现迭代逻辑
  8. 【关键点 3】foreach 无需实现 ICollection,但配合索引器可增强功能
  9. 【易错点 1】遗漏实现 IDisposable 导致资源未释放
  10. 【易错点 2】枚举过程中修改集合可能引发 InvalidOperationException
  11. 【易错点 3】错误地返回非泛型 IEnumerator 导致值类型装箱