7

書く代わりに:

if (obj.Collection == null)
    obj.Collection = new Collection();
obj.Collection.Add(something);

私は書くことを考えました:

obj.Collection = obj.Collection ?? new Collection;
obj.Collection.Add(something);

特にこの部分「obj.Collection = obj.Collection...」

皆さんはどう思いますか ?

よろしく、

4

4 に答える 4

15

これら 2 つのコード ブロックのどちらかを選択する必要がある場合は、前者を使用します。より読みやすく、一般的なパターンです。??値をデフォルトにする必要があるシナリオで役立ちます (例: DateTime date = nullableDateTimeInstance ?? defaultDate;)。

しかし、率直に言って、コレクションに追加したい状況にならないようにしたいのですが、コレクションが null である可能性があります。代わりに、コレクションがコンストラクターで初期化されていることを確認します。

于 2011-01-23T19:24:39.027 に答える
3

つまり:

if (obj.Collection == null)
   {
      obj.Collection = new Collection();
   }
obj.Collection.Add(something);

その場合、次のように書き換えることができます。

(obj.Collection = (obj.Collection ?? new Collection())).Add(something);
于 2011-01-23T19:25:13.410 に答える
0

Collectionそれは、物件のセッターが何をするかにもよると思います。このことを考慮:

public Collection Collection
{
    get { return _collection; }
    set
    {
        _collection = value;
        Thread.Sleep( 1000 ); // or some expensive real work
    }
}

この場合、割り当てobj.Collection = obj.Collection ?? new Collection()は非常にコストがかかります。

ただし、「オンデマンド」でコレクションを作成する必要がある場合は、次のように、プロパティゲッターで同様のパターンを使用するのが一般的です。

public Collection Collection
{
    get { return _collection ?? ( _collection = new Collection() ); } 
}
于 2011-01-23T20:02:11.143 に答える
0

obj.Collection が null でない場合、コードは不要な割り当て (obj.Collection 自体への) を発行しますが、それ以外は元のコレクションと同等です。

時間が重要なセクションで使用しない限り、問題ないように見えます。とにかく、コンパイラが割り当てを最適化できる可能性はありますが、そうなるかどうかはわかりません。

おそらく、元のコードは非常に一般的で単純なパターンであるため、変更するのは間違っていると感じているだけです。

于 2011-01-23T19:22:15.007 に答える