如何翻译“var a = 集合.First().somePropA ??新 A();“

本文关键字:First somePropA 集合 何翻译 翻译 var | 更新日期: 2023-09-27 18:35:20

表达式中使用空合并运算符在赋值右侧使用单个问号的目的是什么?例:

var a = collection?.First()?.somePropA ?? new A();

如何翻译“var a = 集合.First().somePropA ??新 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();
}