对于零条件运算符,以下两种等效方法中的哪种方式最适合主要性能,易用性或清晰度等?
此:
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;
}
性能甚至是个问题吗?
答案 0 :(得分:7)
性能甚至是个问题吗?
简短回答:有关空检查的性能在普通应用程序中永远不会成为问题。这只是可读性和可维护性的问题。
<强>性能:强>
是的,你有1次“明确”检查1.但你必须记住:
我发现只有很小的性能差异:如果child
或Mother
或Father
不是局部变量或简单的普通属性,而是非常的方法和属性长执行时间。例如,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,则不执行其他操作。