Null-condition和null-coalescing operator * vs. * plain boolean表示法

时间:2018-04-16 09:08:20

标签: c# operators notation

示例1:

var ca = p.GetCustomAttribute<ConnectorAttribute>();
return ca?.Point.IsEqual(cp) ?? false;

示例2:

var ca = p.GetCustomAttribute<ConnectorAttribute>();
return (null != ca) && ca.Point.IsEqual(cp);

问题:

  • 这两个示例是否会返回相同的结果?
  • 哪一个表现更好?
  • 是否有任何关于线程安全的问题?

编辑:没有人提及,但标题有一些错误,我已经纠正过了。

编辑2:根据评论,&#39;这些代码是相同的&#39;。对我而言,它仍然不像接缝那样微不足道。

答案here表示示例1的第一部分创建了Nullable<bool>类型。是否因为零合并运算符而优化?

2 个答案:

答案 0 :(得分:2)

回答你的第一个问题:是的。

对第二个问题的简短回答:没有,你应该选择哪个更具可读性。

回答你的第三个问题:如果你希望整个表达能够一次性运行&#34;&#34;并且因此不受并发问题的影响,那么不,null-coalescing运算符不能保证在Stackoverflow question的答案中解释。 在您的两个示例中,您实际上都面临着相同的并发性挑战。

对第二个问题的答案很长:

查看Microsoft '??' doc,提到的是运营商的目的和功能:

  

?? operator被称为null-coalescing运算符。如果操作数不为null,则返回左侧操作数;否则它会返回右手操作数。

因此,null-coalescing运算符使您编写更清晰的代码,否则您需要两次编写有问题的操作数(如第二个示例中所示)。

null-coalescing运算符的使用与效用比性能更相关,正如similar Stackoverflow question所接受的答案所解释的那样。实际上,两者表现完全一样。

有趣的是,作为同一答案的一部分,null-coalescing运算符似乎执行得稍微快一些,但差别很小,可以忽略。

答案 1 :(得分:0)

要回答你的问题(null != ca)等于ca??(这提供了更多的可读性和更短的版本)它运算符只是检查值是否为null,不确定但是编译器在做同样事情的引擎盖,你可以使用反射器检查。

只是为了不是两个都会给你相同的结果并且执行也是相同的,它只是C#的编译器在引擎盖下用空检查替换?