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

C# 6.0 multiple identical null conditional operator checks vs single traditional check

就主要性能以及易用性或清晰度等方面而言,以下两种等效方法中哪一种最适合空条件运算符?

这个:

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

性能是个问题吗?

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

?. 运算符名称类似于 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 为空,则不会执行其他操作。

Is performance even an issue?

简短回答:null-checks 的性能在普通应用程序中永远不会成为问题。这只是可读性和可维护性的问题。

性能:

是的,你有 3 次 "explicit" 检查 1 次。但你必须记住:

  1. 每次您引用 object 实例时,系统都会执行 "implicit" null-check,如 here 所述,并且afaik JIT 根本没有优化 null-checks。所以在你的情况下,比率不仅仅是 3 比 1。
  2. A null-check 是一个非常(真的,非常)便宜的操作,与您在正常软件流程中执行的大多数操作(实例堆分配、数学计算)相比,一个 linq 查询,图形 object 渲染,字符串解析,...)。

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

可读性:

单个首字母 if 允许在心理上分离不同的代码块。假装自己是代码的reader,别的什么都不知道:问自己是"if child is not null do all this operations and stuffs, otherwise just move on"读起来更简单,还是[=读起来更简单74=].

可维护性:

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

编辑:

有关空条件运算符的 thread-safety 的讨论,请参阅 this question