C#中==运算符与?.运算符的空值检查,哪种速度更快?
两种C#空值与集合非空判断写法的性能对比
先明确两种写法的逻辑等价性:
- 写法1:
if (tksPesin.prmBilgi != null && tksPesin.prmBilgi.Any())
传统短路与操作,先判断prmBilgi是否为null,若为null则直接跳过Any()调用,避免空引用异常。 - 写法2:
if (tksPesin.prmBilgi?.Any() ?? false)
利用空条件运算符?.和空合并运算符??实现:prmBilgi为null时,?.Any()返回null,再通过?? false转为false;非null时正常调用Any()返回布尔值。
性能对比
在绝大多数业务场景下,这两种写法的性能几乎没有差异:
- 从IL中间语言层面看,Roslyn编译器会对这类常见模式做优化,两种写法编译后的代码非常接近,甚至完全一致。
- 只有在极端高频调用的场景(比如百万次以上循环),才可能测出极其微小的性能差距,但这种差距在实际业务代码中完全可以忽略,不会成为性能瓶颈。
选择建议
性能不是选择这两种写法的核心依据,更应该考虑代码可读性和团队编码规范:
- 如果团队习惯现代C#的简洁语法,写法2更紧凑;
- 如果更倾向于显式的空值检查逻辑,写法1更直观,对新手更友好。
内容的提问来源于stack exchange,提问作者Abolfazl Pourmohammad
相关产品推荐
相关产品推荐

