24

だから私は??に興味をそそられました オペレーターですが、まだ使用できていません。私は通常、次のようなことをしているときにそれについて考えます。

var x = (someObject as someType).someMember;

someObjectが有効で、someMemberがnullの場合、次のことができます。

var x = (someObject as someType).someMember ?? defaultValue;

しかし、someObjectがnullの場合、ほとんどの場合、問題が発生します。自分でヌルチェックを行うよりも、これをクリーンにするのに役立ちません。

皆さんはどのような用途を見つけましたか?実際の状況では?

4

13 に答える 13

32

この??演算子は、SQL の合体メソッドに似ており、null 以外の最初の値を取得します。

var result = value1 ?? value2 ?? value3 ?? value4 ?? defaultValue;
于 2009-11-06T18:52:14.397 に答える
22

私は通常、文字列または null 許容型に使用します。

string s = someString ?? "Default message";

よりも簡単です

   string s;
   if(someString == null)
     s = "Default Message";         
   else
     s = someString;

また

  string s = someString != null ? someString : "Default Message";
于 2009-11-06T18:51:49.293 に答える
12

プロパティ内の遅延インスタンス化されたオブジェクトによく使用します。

public MyObject MyProperty
{
    get
    {
        return this.myField ?? (this.myField = new MyObject());
    }
}

これは、C#では割り当てが式であるという事実を利用しているため、式の結果(割り当てられた値)をすべて同じステートメントで割り当てて使用できます。私はまだこのコードパターンについて少し汚い感じがしますが、それは代替案(下記)よりも簡潔なので、ほぼ勝ちです。

public MyObject MyProperty
{
    get
    {
        if (this.myField == null)
        {
            this.myField = new MyObject();
        }

        return this.myField;
    }
}
于 2009-11-06T19:42:32.503 に答える
8

参考までに、三項演算子は null 合体演算子とは異なる IL のシーケンスを生成します。最初は次のようになります。

// string s = null;
// string y = s != null ? s : "Default";
    ldloc.0
    brtrue.s notnull1
    ldstr "Default"
    br.s isnull1
    notnull1: ldloc.0
    isnull1: stloc.1

後者は次のようになります。

// y = s ?? "Default";
    ldloc.0
    dup
    brtrue.s notnull2
    pop
    ldstr "Default"
    notnull2: stloc.1

これに基づいて、ヌル合体演算子はその目的に合わせて最適化されており、単なる構文糖ではないと思います。

于 2009-11-06T20:59:21.427 に答える
7

?? 実際には、null チェック演算子です。

コードが問題になる理由は、「someObject が null の場合、.someMember は null オブジェクトのプロパティです。最初に someObject の null を確認する必要があります。

編集:

はい、見つけますか?? 特にLINQからのデータベース入力の処理だけでなく、他の場合にも非常に役立ちます。重く使っています。

于 2009-11-06T18:50:42.540 に答える
1

通常の操作で null を返すことができるメソッドを操作する際に使用します。

たとえば、コンテナーにキーが含まれていない場合 (または null が有効な関連付けである場合) に null を返す Get メソッドを持つコンテナー クラスがあるとします。それから私はこのようなことをするかもしれません:

string GetStringRep(object key) {
    object o = container.Get(key) ?? "null";
    return o.ToString();
}

明らかに、これら 2 つのシーケンスは同等です。

foo = bar != null ? bar : baz;
foo = bar ?? baz;

2 番目は単にもっと簡潔です。

于 2009-11-06T19:11:32.113 に答える
1

あなたの場合、 DefaultObject を静的プロパティとして作成し、以下のように使用できます...

var x = (someObject as someType ?? someType.DefaultObject).someMember;

DefaultObject が静的な読み取り専用オブジェクトを返す場所。

EventArgs.Empty、String.Empty などのように...

于 2009-11-06T18:54:34.043 に答える
0

私はあなたとまったく同じ問題を抱えていましたが、LinqToXML を使用するスペースではタグがドキュメントに??ない可能性があるため、そのタグのプロパティを結合するために使用することはできません。

C# にはグローバル変数のようなものがないので、すべてがクラスにあるので、あなたと同じように ?? ほとんど役に立たない。

次のような単純なプロパティ ゲッターでさえ:

MyObject MyObj() { get { return _myObj ?? new MyObj(); } }

おそらくイニシャライザの方が良いでしょう...

SQL のように、Linq クエリで多少役立つと思いますが、現時点では実際に派生させることはできません。

于 2009-11-06T18:55:18.323 に答える