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

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

这个:

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;    
}

表现甚至是个问题吗?

解决方法

Is performance even an issue?

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

性能

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

>每次引用对象实例时,系统都会执行“隐式”空值检查,如here所述,并且JIT根本不优化空值检查.所以在你的情况下,费率不仅仅是3比1.
>与常规软件流中的大多数操作(实例堆分配,数学计算,linq查询,图形对象渲染,字符串解析等)相比,null检查是一种非常(非常非常)廉价的操作. .

我看到只有很大的性能差异的可能性:如果child或Mother或Father不是局部变量或简单的普通属性,而是具有很长执行时间的方法属性.例如,GetChild()方法需要2秒才能执行.你能看到一个真实的场景吗?我不能.即使是这种情况,您可以一次调用GetChild()并将其分配给局部变量,然后调用child? 3次.

可读性:

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

可维护性:

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

编辑:

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...