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

在 C# 中,如何基于事件和委托设计观察者模式的变体,并说明其与标准观察者模式在通知机制上的区别?

考察说明

考查 C# 中事件和委托作为观察者模式实现方式的理解,以及变体设计的能力。

回答思路

  1. 【回答框架 1】事件是 C# 中基于委托的成员,用于发布-订阅通信。标准观察者模式包含主题、观察者和通知方法,而事件提供内置的多播委托和封装性,外部只能通过 += 和 -= 订阅或取消。
  2. 【回答框架 2】变体设计可用事件直接实现通知,主题通过触发事件向订阅者广播,而不需要维护观察者集合。事件类型可自定义,使用 EventHandler 或自定义委托,允许传递自定义参数。
  3. 【回答框架 3】与标准模式相比,事件封装了订阅管理,简化代码;但事件不支持检查订阅者列表,且同步触发可能影响性能。变体可实现异步事件或使用弱事件模式避免内存泄漏。
  4. 【回答框架 4】实现时需注意线程安全,使用锁定机制确保事件触发和订阅的一致性;考虑异常处理,避免一个订阅者异常影响其他订阅者;使用弱事件模式防止长期引用问题。
  5. 【关键点 1】事件基于委托,提供 += 和 -= 订阅机制
  6. 【关键点 2】事件封装订阅管理,外部无法直接赋值,内建多播
  7. 【关键点 3】变体常用自定义委托或 EventHandler 传递数据
  8. 【关键点 4】弱事件模式解决内存泄漏问题
  9. 【关键点 5】异步事件可提升响应性,但需考虑并发安全
  10. 【易错点 1】事件触发时订阅者异常会中断后续调用,需捕获处理
  11. 【易错点 2】多线程订阅或触发需同步,避免竞态
  12. 【易错点 3】委托链可能因未移除订阅导致内存泄漏