2

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

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

3 回答 3

6

单引号 ( ?.) 是 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()在进行所有检查之前进行初始化),但为了清楚起见,我保持这种方式。

于 2016-02-18T08:36:52.927 回答
3

?.是一个新的运算符,可帮助开发人员省略对 null 的过多检查。

您可以在此处阅读更多信息:https ://msdn.microsoft.com/en-us/library/dn986595.aspx

于 2016-02-18T08:37:53.353 回答
2

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();
}
于 2016-02-18T08:36:18.127 回答