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

C#中空委托声明与空条件运算符的使用对比及优劣疑问

C#事件触发的两种写法对比

这两种写法都是安全触发事件的常用方式,各有优劣,不完全是个人偏好:

空委托初始化写法

public event Action MyEvent = delegate { };

MyEvent.Invoke();
  • 核心优势:完全不需要写空值判断逻辑,不管有没有订阅者,MyEvent永远不会为null,调用Invoke时不会抛出空引用异常,完美契合你“少写条件检查”的需求。
  • 小劣势:会额外创建一个空委托实例,虽然这个实例的内存开销微乎其微,但理论上存在冗余;另外当所有订阅者取消订阅后,事件引用依然指向这个空委托,不会回到null(不过日常开发中这个点几乎不会产生影响)。

空合并运算符写法(C#6+支持)

public event Action MyEvent;

MyEvent?.Invoke();
  • 核心优势:没有多余的空委托实例,内存利用更高效;语法简洁直观,是C#6及以后版本的原生空值处理语法,也是当前更主流的写法。
  • 小劣势:编译器会把?.Invoke()自动转换成隐含的空值检查逻辑(等价于if (MyEvent != null) MyEvent.Invoke()),不过这个检查非常轻量,几乎不会影响性能。

总结

两种写法都能安全完成事件触发,选择哪种主要看团队编码规范和个人习惯:

  • 如果项目还在使用C#6之前的版本,只能用空委托写法;
  • 如果用的是现代C#版本,?.Invoke()的写法更推荐,因为它贴合当前语言设计风格,也没有不必要的对象创建;
  • 如果你极度在意“完全不写条件检查”的代码风格,空委托写法也完全可行,不会带来明显的性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:56:01