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

GDS*_*GDS 8 c# c#-6.0 null-conditional-operator

在主要性能和易用性或清晰度等方面,以下两种等效方式对于零条件运算符最佳?

这个:

idString = child?.Id;
fatherName = child?.Father?.Name;
motherName = child?.Mother?.Name;
Run Code Online (Sandbox Code Playgroud)

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

if (child != null)
{
    idString = child.Id;
    fatherName = child.Father?.Name;
    motherName = child.Mother?.Name;    
}
Run Code Online (Sandbox Code Playgroud)

性能甚至是一个问题吗?

Mas*_*aus 8

性能甚至是一个问题吗?

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

性能:

是的,您对1进行了3次"明确"检查.但您必须记住:

  1. 该系统执行"隐含的"零检查每一个你引用一个对象实例时,作为解释在这里,和AFAIK的JIT不优化空的检查都没有.因此,在您的情况下,费率不仅仅是3比1.
  2. 与在正常软件流中进行的大多数操作(实例堆分配,数学计算,linq查询,图形对象渲染,字符串解析等)相比,空检查是一种非常(非常非常)廉价的操作.

我只看到显著的性能差异远程可能性:如果child还是MotherFather不是本地变量或简单的纯性质,但方法和属性有很长的执行时间.例如,一个GetChild()需要2秒才能执行的方法.你能看到一个真实的场景吗?我不能.即使是这种情况,您也可以调用GetChild()一次并将其分配给局部变量,然后调用child?3次.

可读性:

单个初始if允许在心理上分离不同的代码块.假装是代码的读者,不知道其他任何事情:问自己是否更简单的阅读"如果孩子不是空的做所有这些操作和东西,否则只是继续",或"如果孩子不是空的检查姓名.如果孩子不是空的,请检查母亲.如果母亲不是空的,请获取母亲的姓名.然后,如果孩子不是空的,请检查父亲.如果父亲不是空...... ......".

可维护性:

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

编辑:

有关null条件运算符的线程安全性的讨论,请参阅此问题.

  • @dviljoen对于像我这样的意大利人来说,用简短的句子表达思想总是很难,但是......但是SO是一个很好的健身房.我重新写了我的答案,但它仍然很长.既然问题涉及"性能","易于使用"和"清晰度",那么给出一些有用的元素是最小的......不是吗?你看到其他可拆卸/简化部件吗? (2认同)
  • 使用DRY原则的可维护性评论+1.虽然这是一个很长的答案,但它可以,因为目标不是解决特定问题,而是解决问题并确认新的空条件运算符产生的模式. (2认同)