使用空合并运算符的表达式中赋值右侧的单个问号的目的是什么?例子:
var a = collection?.First()?.somePropA ?? new A();
使用空合并运算符的表达式中赋值右侧的单个问号的目的是什么?例子:
var a = collection?.First()?.somePropA ?? new A();
单引号 ( ?.
) 是 C# 6.0 中新添加的,表示null
检查。
因此,例如,以下代码是相同的;
var foo = bar?.bar2;
或者
var foo = null;
if (bar != null)
foo = bar.bar2;
else
foo = null;
但是,两者仍然可以返回null
。因此,如果结果确实是 ,则可以使用??
检查来分配一个值null
。
话虽如此,可以编写以下代码;
var foo = bar?.bar2 ?? new Bar2();
这基本上与
var foo = null;
if (bar != null)
foo = bar.bar2;
else
foo = new Bar2();
?.
多次使用确实可以缩短您的代码。例如,考虑以下行;
var foo = bar?.bar2?.bar3?.bar4?.bar5 ?? new Bar5();
这是语法糖
var foo = null;
if (bar != null)
{
if (bar.bar2 != null)
{
if (bar.bar2.bar3 != null)
{
if (bar.bar2.bar3.bar4 != null)
{
if (bar.bar2.bar3.bar4.bar5 != null)
foo = bar.bar2.bar3.bar4.bar5;
else
foo = new Bar5();
}
else
foo = new Bar5();
}
else
foo = new Bar5();
}
else
foo = new Bar5();
}
else
foo = new Bar5();
当然,已经有更好的方法来编写上述内容(例如,通过foo = new Bar5()
在进行所有检查之前进行初始化),但为了清楚起见,我保持这种方式。
?.
是一个新的运算符,可帮助开发人员省略对 null 的过多检查。
您可以在此处阅读更多信息:https ://msdn.microsoft.com/en-us/library/dn986595.aspx
collection.First()
从集合中取出第一个项目。如果不是null
,它将调用somePropA
. 如果是null
(这里是这个运算符的目的),它将返回null
:这只是进行空检查的一种聪明方法。它被称为空条件运算符。
该单个字符无需检查每个属性或返回值null
。
另一种写法:
var a = ( collection != null && collection.First() != null
? collection.First().somePropA : null
) ?? new A();
或者:
A a;
if (collection != null && collection.First() != null)
{
a = collection.First().somePropA;
}
else
{
a = null;
}
if (a == null)
{
a = new A();
}