You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#中可将event赋值给delegate类型变量?

为什么C#中事件可以赋值给同类型的委托变量?

你提到的这个点其实是C#事件的编译器语法糖细节,核心原因如下:

  • 当你声明public event PropertyChangedEventHandler PropertyChanged;时,编译器会自动生成两个关键内容:

    1. 一个私有委托字段(类型就是PropertyChangedEventHandler),用来存储所有注册的事件处理程序
    2. 公开的add和remove方法,外部代码只能通过+=/-=调用这两个方法操作事件,无法直接访问内部的委托字段
  • 但在类的内部,直接写PropertyChanged时,实际访问的就是编译器生成的这个私有委托字段,它的类型就是PropertyChangedEventHandler,所以自然可以赋值给同类型的委托变量:

    PropertyChangedEventHandler handler = PropertyChanged;
    

这种写法常见于线程安全的事件触发逻辑:先把当前的委托实例复制到局部变量,再判断是否为null后触发,避免触发过程中其他线程修改事件委托导致的空引用问题。

另外要注意,在类的外部,你不能直接赋值或调用事件,只能用+=/-=来注册/取消处理程序——这也是事件和普通委托的关键区别:事件对外只暴露订阅/取消订阅的能力,而内部可以完全操控底层的委托实例。

内容的提问来源于stack exchange,提问作者user32882

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:35:23