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

在 C# 编程语言中,理解委托(delegate)与事件(event)的关键差异有哪些?请从声明方式、调用权限、内部实现以及典型使用场景等角度进行阐述。

考察说明

考查对 C# 委托与事件核心机制的理解及实际应用中的区别。

回答思路

  1. 【回答框架 1】委托可视为类型安全的函数指针,用于封装方法引用。声明委托类型后,可定义委托变量并赋值,直接通过委托变量调用其指向的方法。事件则基于委托实现,是委托的封装,为发布者提供订阅和取消订阅的接口,但对外隐藏了触发调用的能力。
  2. 【回答框架 2】从调用权限看,委托变量可以在类外部直接调用,而事件在定义类的外部只能通过+=和-=操作符进行添加或移除处理程序,不能直接调用触发。事件通过私有委托字段和访问器限制外部触发,从而保护封装性和安全性。
  3. 【回答框架 3】从内部实现看,事件实际上封装了一个私有的委托字段,并提供add和remove访问器来实现订阅管理。编译器将事件转换为一个私有的委托字段和两个方法(add和remove)。委托则直接作为字段存储方法引用。
  4. 【回答框架 4】在使用场景上,委托常用于简单的回调,如异步操作或作为参数传递。事件则用于发布-订阅模式,如UI控件的事件处理、通知机制,提供松耦合的通信。事件还常常与接口结合,形成标准的事件模式。
  5. 【回答框架 5】此外,事件具有调用安全特性,例如在触发前会检查是否有订阅者,而委托的调用可能引发空引用异常。事件也支持自定义add和remove访问器,实现更高级的订阅逻辑。
  6. 【关键点 1】委托是类型,事件基于委托封装,是更受限制的委托。
  7. 【关键点 2】事件外部只能通过+=和-=订阅,不能直接调用;委托可直接调用。
  8. 【关键点 3】事件封装了私有委托字段,通过add和remove访问器管理订阅。
  9. 【关键点 4】事件用于发布-订阅模式,委托常用于回调。
  10. 【易错点 1】不能直接在类外部触发事件,但可以通过公有方法间接触发。
  11. 【易错点 2】事件在触发前需检查是否有订阅者,避免空引用。
  12. 【易错点 3】自定义事件访问器时容易出错,需确保线程安全性,但一般推荐使用默认实现。