Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单行if语句检查null是否与null合并运算符相同?_C#_Null_Null Coalescing Operator - Fatal编程技术网

C# 单行if语句检查null是否与null合并运算符相同?

C# 单行if语句检查null是否与null合并运算符相同?,c#,null,null-coalescing-operator,C#,Null,Null Coalescing Operator,我目前正在阅读一些(旧的)从一个域模型到另一个域模型的映射代码,我偶然发现了一些东西。 编辑: 这些域模型之间的区别在于它们的版本。所以很多字段都是以后缀V2或V3命名的。MigrateToLastMethods只是在类型之间映射的映射函数。例如,如果对元素列表调用MigrateToLatest,则每个元素都会调用其MigrateToLatest方法。如果这些元素再次包含复杂元素,则再次调用MigrateToLatest 好的,有很多类似这样的代码 return this.SomeFieldV

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

好的,有很多类似这样的代码

 return this.SomeFieldV3!= null ? this.SomeFieldV2.MigrateToLatest() : null;
但也有一些coe看起来像这样

return this.SomeField = this.SomeField ?? null,
所以我知道在第一行中,为了避免null指针异常,首先检查字段是否为null,否则返回null。但是我不太懂第二行,或者至少我不认为我懂

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

对我来说,这两行代码似乎在做同样的事情,但既然我知道是同一个程序员编写了整个mapping类,我就无法摆脱这样一种感觉,即它们是不同的——为什么还有人会选择以两种不同的方式做同样的事情呢


那么这两行代码做的事情是否相同呢?如果它们是首选用法,如果它们不是,请有人详细说明区别

阅读此答案以了解有关空合并运算符的更多信息

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

因为在第二种情况下,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;

this.SomeField.MigrateToLatest()
可能与
this.SomeField
不完全相同。另外,第二个示例在返回该值之前分配
this.SomeField
。你可能想提供精确的真实例子。我同意@BoltClock。这个问题模棱两可,无法回答。但您是对的,在第二个示例中,
是多余的。语句:“returnthis.SomeField=This.SomeField??null”是冗余的。“returnthis.someField”就足够了。这两行做的事情不一样,根本不相等。第一个避免了空引用异常,第二个完全没有意义。