C#中未初始化与委托初始化的event Action存在哪些差异?
C#中两种事件声明方式的差异
这两种声明方式的核心区别在于事件的初始状态,具体细节如下:
未初始化的事件
代码:public event Action<MyType> MyEvent;- 事件默认值为
null,触发前必须做非空检查,否则会直接抛出NullReferenceException - 正确调用示例:
// 传统非空检查写法 if (MyEvent != null) { MyEvent(new MyType()); } // C#6及以上版本可简化为 MyEvent?.Invoke(new MyType());
- 事件默认值为
空委托初始化的事件
代码:public event Action<MyType> MyEvent = delegate { };- 事件被初始化为一个空的匿名委托,永远不会为
null,触发时无需做任何非空检查 - 直接调用即可:
MyEvent(new MyType());
- 事件被初始化为一个空的匿名委托,永远不会为
额外说明:
- 空委托的方式会带来极其微小的性能开销(调用空方法),但绝大多数业务场景下完全可以忽略
- 虽然C#6之后的空条件运算符已经简化了非空检查逻辑,但空委托的写法能让触发事件的代码更简洁,避免重复编写检查语句
内容的提问来源于stack exchange,提问作者OmniOwl
相关产品推荐
相关产品推荐

