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