2

null合体演算子を使用した式の代入の右側にある単一の疑問符の目的は何ですか? 例:

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 に答える
2

collection.First()コレクションから最初のアイテムを取ります。そうでない場合はnull、 を呼び出しますsomePropA。そうである場合null(この演算子の目的はここにあります)、次の値を返しnullます。これは、null チェックを実行するスマートな方法です。これはnull 条件演算子と呼ばれます。

この 1 文字により、すべてのプロパティや戻り値をチェックする必要がなくなります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 に答える