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

前端之家收集整理的这篇文章主要介绍了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.

猜你在找的C#相关文章