11

Which out of the following two equivalent ways would be best for the null conditional operator in terms of primarily performance and then ease of use or clarity etc.?

This:

idString = child?.Id;
fatherName = child?.Father?.Name;
motherName = child?.Mother?.Name;

or (assuming that all local vars are null already) this:

if (child != null)
{
    idString = child.Id;
    fatherName = child.Father?.Name;
    motherName = child.Mother?.Name;    
}

Is performance even an issue?

4

2 回答 2

10

性能甚至是一个问题吗?

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

表现:

是的,您有 3次针对 1 的“显式”检查。但您必须记住:

  1. 每次引用对象实例时,系统都会执行“隐式”空检查,如此所述,并且 Afaik JIT 根本不优化空检查。因此,在您的情况下,比率不仅仅是 3 对 1。
  2. 与您在普通软件流程中执行的大多数操作(实例堆分配、数学计算、linq 查询、图形对象渲染、字符串解析......)相比,空值检查是一种非常(非常非常)便宜的操作。

我只看到了显着性能差异的微小可能性:是否是局部变量child或简单的普通属性,而是执行时间很长的方法和属性。例如,执行需要 2 秒的方法。你能看到一个现实的场景吗?我不能。即使是这种情况,您也可以调用一次并将其分配给局部变量,然后调用3 次。MotherFatherGetChild()GetChild()child?

可读性:

单个首字母if允许在心理上分离不同的代码块。假装自己是代码的读者,不知道其他任何事情:问问自己是否更容易阅读“如果孩子不为空,请执行所有这些操作和东西,否则继续前进”“如果孩子不为空,请检查名称。如果孩子不为空,请检查母亲。如果母亲不为空,则获取母亲的姓名。然后,如果孩子不为空,请检查父亲。如果父亲不为空...... ... ...“

可维护性:

又名,在这种情况下,DRY 原则。例如,为什么要重复空检查 3 次?假设在未来的某个时刻,你的老板要求你更改代码:不仅需要检查孩子的无效性,还要检查它Id是否为 0(类似的事情在任何软件开发过程中都非常频繁地发生) . 在您的第一个代码部分中,您应该更正 3 行。在您的第二个代码部分中,您应该只更正 1 行:初始if.

编辑:

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

于 2016-12-06T14:45:18.723 回答
0

在变量的第二个代码示例中,不会设置新值,但在第一个示例中,它们设置为 null 或来自指定属性的值。

?.运算符名称类似于空条件运算符。该运算符的工作方式如下:

随着使用?.

var result = someProperty?.someField;

不使用?.

if (someProperty != null)
    result = someProperty.someField;
else
    result = null;

关于此运算符,您可以在此处阅读:https ://msdn.microsoft.com/en-us/library/dn986595.aspx 。

最好在fluent方法调用中使用它。在您的示例中最好使用第二个变体,因为如果child为空,则不会执行其他操作。

于 2016-12-06T12:36:36.827 回答