如何翻译"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