为何C#中可将event赋值给delegate类型变量?
为什么C#中事件可以赋值给同类型的委托变量?
你提到的这个点其实是C#事件的编译器语法糖细节,核心原因如下:
当你声明
public event PropertyChangedEventHandler PropertyChanged;时,编译器会自动生成两个关键内容:- 一个私有委托字段(类型就是
PropertyChangedEventHandler),用来存储所有注册的事件处理程序 - 公开的
add和remove方法,外部代码只能通过+=/-=调用这两个方法操作事件,无法直接访问内部的委托字段
- 一个私有委托字段(类型就是
但在类的内部,直接写
PropertyChanged时,实际访问的就是编译器生成的这个私有委托字段,它的类型就是PropertyChangedEventHandler,所以自然可以赋值给同类型的委托变量:PropertyChangedEventHandler handler = PropertyChanged;
这种写法常见于线程安全的事件触发逻辑:先把当前的委托实例复制到局部变量,再判断是否为null后触发,避免触发过程中其他线程修改事件委托导致的空引用问题。
另外要注意,在类的外部,你不能直接赋值或调用事件,只能用+=/-=来注册/取消处理程序——这也是事件和普通委托的关键区别:事件对外只暴露订阅/取消订阅的能力,而内部可以完全操控底层的委托实例。
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

