这个:
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.