oneline if语句检查null与null-coalescing运算符相同吗?

时间:2014-11-28 09:39:46

标签: c# null null-coalescing-operator

我目前正在阅读从一个域模型到另一个域模型的一些(旧)映射代码,并且我偶然发现了一些事情。 编辑: 这些领域模型之间的区别在于它们的含义。因此,很多字段以例如V2或V3命名。 MigrateToLatest方法只是映射在类型之间映射的函数。因此,例如,如果在元素列表上调用MigrateToLatest,则每个元素都会调用它的MigrateToLatest方法。如果这些元素再次包含复杂元素,则会再次调用MigrateToLatest。

好的,所以很多的代码看起来像这样。

 return this.SomeFieldV3!= null ? this.SomeFieldV2.MigrateToLatest() : null;

但是还有一些看起来像这样的系数

return this.SomeField = this.SomeField ?? null,

所以我理解在第一行中,为了避免空指针异常,它首先检查该字段是否为空,否则返回null。但我真的不明白第二行 - 或者至少我不认为我做了......

我在MSDN上看了??运算符,但在这种情况下它似乎是多余的。如果该值不为null,则返回该字段,如果该字段不返回,则返回null? :-S

对我而言,看起来这两行都在做同样的事情,但由于我知道同一个程序员编写整个映射类的事实,我不能感觉到它们不同的感觉 - 为什么呢有人会选择以两种不同的方式做同样的事情吗?

这两行代码是否做同样的事情?如果它们是首选用途,如果它们不是,那么请有人详细说明差异

1 个答案:

答案 0 :(得分:2)

阅读此答案以了解有关null-coalescing operator的更多信息。

stackoverflow.com/questions/446835/what-do-two-question-marks-together-mean-in-c

我只能说他们做的是同样的事情,但第一个更好更快。

因为在第二种情况下,RHS对此进行评估:

this.SomeField ?? null

相当于

this.SomeField != null ? this.SomeField : null;

所以整个代码

return this.SomeField = this.SomeField ?? null;

评估为

return this.SomeField = this.SomeField != null ? this.SomeField : null;

正如您所看到的那样,代码重复可以通过仅使用它来最小化:

return this.SomeField ?? null;
相关问题