在扁平化层次结构和/或映射对象时非常有用。而不是:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
可以这样写(逻辑同上)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
DotNetFiddle.Net Working Example.
(?? or null-coalescing operator 与 ? or null conditional operator 不同)。
它也可以在Action 的赋值运算符之外使用。而不是
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
可以简化为:
myAction?.Invoke(TValue);
DotNetFiddle Example:
使用系统;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
结果:
测试 2
基本上,我已经申请了?。模型之后的运算符也是如此。我想知道它是否可以直接应用于模型还是仅适用于导航属性?
无论值的类型如何,左侧值上的 ? or null conditional operator 运算符。编译器并不关心右边的值是什么。这是一个简单的编译器magic(意味着它做了一些你已经可以做的事情,只是简化了原因)。
例如
var a = model?.Value;
和说的一样
var a = model == null ? null : model.Value;
在第二种情况下,检查 null 的评估与返回的值没有关联。 null 条件运算符 基本上只在左值为 null 时返回 null。
成员的类型(方法、字段、属性、构造函数).Value 无关紧要。
您的 DotNetFiddle 示例不起作用的原因是用于 .Net 4.7.2 的编译器与支持 null 条件运算符的 c# 版本不兼容。将其更改为 .Net 5,有效:
https://dotnetfiddle.net/7EWoO5