为何C#中null委托与事件执行+=操作不会触发错误?
问题解答
委托的null +=为何不报错?
C#里委托的+=是语法糖,编译器会把GreetDelegate += GreetInEnglish;翻译成如下等价代码:
GreetDelegate = GreetDelegateType.Combine(GreetDelegate, GreetInEnglish);
Delegate.Combine方法本身就兼容null参数:如果第一个参数是null,直接返回第二个委托实例;如果第二个参数是null,返回第一个参数;否则合并两个委托的调用列表。所以哪怕原委托变量是null,这个调用也能正常执行,最终会把GreetInEnglish赋值给GreetDelegate,不会触发null错误。
事件的null +=会调用add方法吗?
会的。对于事件来说,+=操作会触发编译器自动生成的add访问器(除非你手动实现了事件的add/remove逻辑)。自动生成的add访问器内部,会先获取当前事件对应的底层委托字段值(此时是null),然后调用Delegate.Combine合并null和新的事件处理方法,再把合并后的结果赋值回字段,同时还会加上线程安全的锁(静态事件用lock(typeof(Program)),实例事件用lock(this))。
本质上事件的+=逻辑和委托变量一致,只是多了线程安全的保障,所以即使事件初始为null,+=操作也能正常执行,不会报错。
内容的提问来源于stack exchange,提问作者joseville
相关产品推荐
相关产品推荐

