Null-condition 和 null-coalescing 运算符 *vs.* 普通布尔符号

Null-condition and null-coalescing operator *vs.* plain boolean 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:根据评论,'those code are the same'。对我来说,它仍然不像它看起来那么微不足道。

答案 here 说明示例 1. 的第一部分创建了一个 Nullable<bool> 类型。它是否因为 null-coalescing 运算符而优化?

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

只是不是两者都会给你相同的结果并且执行也相同,它只是 C# 的编译器,它在后台用 null 检查替换 ?

第一个问题的答案:是。

第二个问题的简答:None,你应该根据哪个更具可读性来选择。

回答你的第三个问题:如果你希望整个表达式 运行 “一次完成”,因此不会受到并发问题的影响,那么不,空合并运算符不保证作为在此 Whosebug question 的答案中进行了解释。 在您的两个示例中,您实际上将面临相同的并发挑战。

第二个问题的详细回答:

查看Microsoft '??' doc,所有提到的是运算符的目的和功能:

The ?? operator is called the null-coalescing operator. It returns the left-hand operand if the operand is not null; otherwise it returns the right hand operand.

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

空合并运算符的使用更多地与效用相关,而不是与性能相关,正如 similar Whosebug question 的公认答案所解释的那样。确实,两者的性能完全相同。

有趣的是,作为同一答案的一部分,空合并运算符的执行速度似乎稍快一些,但差异很小,可以忽略不计。