如何翻译"var a = collection?.First()?.somePropA ?? new A();"
How to translate "var a = collection?.First()?.somePropA ?? new A();"
在带有空合并运算符的表达式中赋值右侧的单个问号有什么用?示例:
var a = collection?.First()?.somePropA ?? new A();
collection.First()
从集合中取出第一项。如果不是 null
,它将调用 somePropA
。如果它是 null
(此运算符的目的来了),它将 return null
:这只是进行空检查的一种聪明方法。它被称为 null-conditional operator.
该单个字符无需检查 null
的每个 属性 或 return 值。
另一种写法:
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();
}
单引号(?.
)是C#6.0新增的,代表null
校验。
所以,比如下面的代码是一样的;
var foo = bar?.bar2;
或
var foo = null;
if (bar != null)
foo = bar.bar2;
else
foo = null;
不过,两者仍然可以returnnull
。因此,如果结果确实是 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
在带有空合并运算符的表达式中赋值右侧的单个问号有什么用?示例:
var a = collection?.First()?.somePropA ?? new A();
collection.First()
从集合中取出第一项。如果不是 null
,它将调用 somePropA
。如果它是 null
(此运算符的目的来了),它将 return null
:这只是进行空检查的一种聪明方法。它被称为 null-conditional operator.
该单个字符无需检查 null
的每个 属性 或 return 值。
另一种写法:
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();
}
单引号(?.
)是C#6.0新增的,代表null
校验。
所以,比如下面的代码是一样的;
var foo = bar?.bar2;
或
var foo = null;
if (bar != null)
foo = bar.bar2;
else
foo = null;
不过,两者仍然可以returnnull
。因此,如果结果确实是 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