代码之家  ›  专栏  ›  技术社区  ›  minus one

空条件和空合并运算符*与*纯布尔表示法

  •  0
  • minus one  · 技术社区  · 6 年前

    示例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:根据注释,“这些代码是相同的”。对我来说,这仍然不是一件小事。

    答案是 here 说明示例1的第一部分。创建 Nullable<bool> 类型它是因为空合并操作符而优化的吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Community CDub    4 年前

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

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

    对第三个问题的回答:如果您希望整个表达式“一次性”运行,因此不受并发问题的影响,那么不,空合并操作符不能保证这一点 Stackoverflow question 。 在这两个示例中,您实际上将面临相同的并发性挑战。

    第二个问题的详细答案:

    查看 Microsoft '??' doc ,只提及操作员的目的和功能:

    这个运算符称为空合并运算符。如果操作数不为null,则返回左侧操作数;否则返回右侧操作数。

    因此,空合并运算符使您可以编写更干净的代码,否则需要您将所讨论的操作数写入两次(如第二个示例所示)。

    空合并运算符的使用与效用的关系比与性能的关系更大,正如 similar Stackoverflow question 事实上,两者的表现完全相同。

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

        2
  •  0
  •   Pranay Rana    6 年前

    回答你的问题 (null != ca) 等于 ca? ? (这提供了更高的可读性和更短的版本)it操作员只需检查值是否为null,不确定但编译器正在做同样的事情,您可以使用reflector进行检查。

    只是为了不让两者都给出相同的结果,而且性能也相同,它只是C#编译器的引擎盖下替换 ? 使用空检查。