C#,这个“if...else...”块是否相当于使用空合并运算符的一行代码

Tom*_*m C 0 c# if-statement null-coalescing-operator

我很好奇这段代码是否:

//value is an object, maybe null, maybe not
if (value == null)
   item.PassageStimuliTitle = "";
else
   item.PassageStimuliTitle = value.ToString().Trim();
Run Code Online (Sandbox Code Playgroud)

相当于这一行:

item.PassageStimuliTitle = (string)(value ?? value.ToString().Trim());
Run Code Online (Sandbox Code Playgroud)

我已经使用 if...else... 很长时间了,但最近在 C# 中遇到了空合并运算符。我用它来防止方法调用中传递的参数出现空异常错误。我认为在上面的示例中使用它是等效的,并将代码从 4 行压缩为 1 行。感谢您的阅读。很想听到反馈。

我希望这两个例子是等效的,但很好奇是否有我遗漏的东西。

Swe*_*per 6

不,空合并运算符表达式编写不正确。a ?? b意思是“b如果a为空则求值,否则求值a”。因此,您使用 null 合并运算符将始终生成NullReferenceExceptionif valueis null - 您的代码将尝试评估value.ToString()何时value为 null。

您的使用??将转化为类似以下 if 语句,我认为您会同意这是非常荒谬的:

if (value == null) {
    item.PassageStimuliTitle = (string)value.ToString().Trim();
} else {
    item.PassageStimuliTitle = (string)value;
}
Run Code Online (Sandbox Code Playgroud)

在某些假设下,if 语句可以重写为:

item.PassageStimuliTitle = value?.ToString().Trim() ?? "";
Run Code Online (Sandbox Code Playgroud)

这使用了null 条件运算符?.。如果value为 null,则整个value?.ToString().Trim()表达式为 null,因此计算 的 RHS ??。否则,.ToString().Trim()将被调用value