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

C#不同空值判断语句的性能对比及选型建议

C# 可空类型空值判断的性能对比与选择

针对你给出的几种int?(可空整数)的空值判断+数值比较写法,从性能和编译逻辑层面拆解如下:


1. (num ?? 0) < 10

空合并运算符??的逻辑是:若num不为null则取num.Value,否则取默认值0。但这种写法的问题在于无论num是否为null,都会先执行空合并操作再做比较。即使num非null,也多了一步“判断是否取默认值”的逻辑(虽然JIT可能会做局部优化,但理论上存在冗余操作)。如果num为null,这里会用0和10比较,和其他写法的逻辑结果一致,但性能略逊。

2. num is < 10

这是C# 9.0引入的模式匹配语法,编译器会自动处理可空类型的null情况:若num为null,条件直接返回false;若不为null,则自动取num.Value与10比较。从IL编译结果来看,它和显式空判断的写法逻辑完全一致,没有多余操作,且代码最简洁。

3. num is not null && num < 10

显式的短路逻辑判断:先检查num是否非null,只有通过空判断后才会访问num.Value做数值比较。编译后的IL代码直接调用HasValue属性判断空值,再取Value执行比较,逻辑直接高效,无冗余。

4. num != null && num < 10

和num is not null && num < 10完全等价——对于可空值类型,!= null编译后本质就是检查HasValue属性。两种写法的IL代码几乎一模一样,性能没有任何差异。


性能总结与选择

  • 最优性能组:num is < 10、num is not null && num < 10、num != null && num < 10。这三种写法的编译逻辑高效且无冗余,性能几乎没有区别。其中num is < 10是C# 9+的推荐简洁写法,num != null && num < 10则更直观易懂,适合所有C#版本。
  • 略逊的写法:(num ?? 0) < 10,因存在不必要的空合并操作,极端高频调用场景下可能会有微小性能损耗,但绝大多数业务场景下差异可忽略。

注意:对于值类型的可空类型,这些写法的性能差异极小,实际开发中优先考虑代码的可读性和团队编码习惯更重要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:55:18