C#6.0多个相同的空条件运算符检查与单个传统检查

时间:2016-12-06 09:56:51

标签: c# c#-6.0 null-conditional-operator

对于零条件运算符,以下两种等效方法中的哪种方式最适合主要性能,易用性或清晰度等?

此:

idString = child?.Id;
fatherName = child?.Father?.Name;
motherName = child?.Mother?.Name;

或(假设所有本地变量都已为空):

if (child != null)
{
    idString = child.Id;
    fatherName = child.Father?.Name;
    motherName = child.Mother?.Name;    
}

性能甚至是个问题吗?

2 个答案:

答案 0 :(得分:7)

  

性能甚至是个问题吗?

简短回答:有关空检查的性能在普通应用程序中永远不会成为问题。这只是可读性和可维护性的问题。

<强>性能:

是的,你有1次“明确”检查1.但你必须记住:

  1. 每次引用对象实例时,系统都会执行“隐式”空检查,如here所述,并且afai根本不优化空检查。因此,在您的情况下,费率不仅仅是3对1。
  2. 与在正常软件流中执行的大多数操作(实例堆分配,数学计算,linq查询,图形对象)相比,null检查是非常(实际上,非常)廉价操作渲染,字符串解析,...)。
  3. 我发现只有很小的性能差异:如果childMotherFather不是局部变量或简单的普通属性,而是非常的方法和属性长执行时间。例如,GetChild()方法需要2秒才能执行。你能看到一个真实的场景吗?我不能。即使是这种情况,也可以一次调用GetChild()并将其分配给局部变量,然后调用child? 3次。

    <强>可读性:

    单个初始if允许在心理上分离不同的代码块。假装成为代码的读者,不知道其他任何事情:问自己是否更容易阅读“如果孩子不是null就做所有这些操作和事情,否则只需继续”或< em>“如果孩子不是空的,请检查姓名。如果孩子不是空的,请检查母亲。如果母亲不是空的,请查看母亲的姓名。然后,如果孩子不是空的,请检查父亲。如果父亲不是空的。 ...... ......“。

    <强>可维护性:

    Aka,在这种情况下,DRY principle。例如,为什么要重复3次空检?假设在未来的某个时刻你的老板要求你改变一个代码:不仅需要检查一个孩子的无效,还要检查它的Id是否为0(这样的事情经常发生在任何软件开发过程)。在您的第一个代码部分,您应该纠正3行。 在第二个代码部分中,您应该只更正一行:初始if

    修改

    有关null条件运算符的线程安全性的讨论,请参阅this question

答案 1 :(得分:0)

在第二个代码示例中,变量不会设置新值,但在第一个示例中,它们从指定的属性设置为null或值。

?.运算符名称,如null-conditional运算符。此运算符的工作方式如下:

使用?.

var result = someProperty?.someField;

不使用?.

if (someProperty != null)
    result = someProperty.someField;
else
    result = null;

关于此运营商,您可以在此处阅读:https://msdn.microsoft.com/en-us/library/dn986595.aspx

最好在fluent方法调用中使用它。在您的示例中,最好使用第二个变体,因为如果child为null,则不执行其他操作。