10

C#は?? =演算子のようなものをサポートすると思いますか?

これの代わりに:

if (list == null)
  list = new List<int>();

次のように書くことができるかもしれません:

list ??= new List<int>();

今、私は使用することができました(しかし、それは私にはよく読めないようです):

list = list ?? new List<int>();
4

5 に答える 5

16

個人的には、2番目の拡張だけが意味があると思います(+=などと同じ線に沿って維持するという点で):

list = list ?? new List<int>();

でも正直なところ、少し不必要だと思います。人々は通常「取得」i += 5;しますが、null合体()で問題が発生する傾向があります??。null合体代入演算子を追加すると...まあ、うまく終了していないようです。

個人的に私は元のコードを好みます:

if(list == null) { list = new List<int>(); }
....

また、考慮してください:他のすべてでは+=-=など-右側は常に評価されます。この場合はそうではありません(場合によっては)。それはさらに混乱を追加します。つまり:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
于 2010-03-30T15:28:14.003 に答える
4

私はいつもこのようなものが欲しかった。私はそれ自体よりもはるかに頻繁にそれを使用し??ます。

ただし、私が本当に望んでいるのは、null以外の場合にのみオブジェクトを逆参照できる演算子の形式です。これを置き換えるには:

    int count = (list != null)? list.Count : 0

このようなもので:

    int count = list??.Count : 0

これは、参照のチェーンが長い場合(悪いデザイン、私は知っています)、特に役立ちますが、たとえば

    int count = foo??.bar??.baz??.list??.Count : 0

??「fooに割り当てるか、nullの場合は代替」としか言えず、「fooのプロパティに割り当てるか、nullの場合は代替」とは言えないため、これは現在のところ不可能です。

于 2010-03-30T15:29:40.653 に答える
4

私がここのどこかでstackoverflowで見つけたトリックは、このようなことをすることでした...

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

...コードで同様の遅延評価を使用できる可能性があります。

于 2010-03-30T16:35:17.073 に答える
3

私はそれが好きです-それは遅延読み込み式を表現するための素晴らしく簡潔な方法です。それが言語に追加されるかどうかはまったく別のことです-EricLippertが指摘するのが大好きなように、新しい機能は実装するのにかなりの量の作業を必要とし、そのため、含まれるためには言語にかなりの正味のプラスをもたらす必要があります。

于 2010-03-30T15:24:54.300 に答える
1

私があなたの質問を間違って読んでいない限り、その演算子はC#に存在します:http://msdn.microsoft.com/en-us/library/ms173224 (VS.80).aspx

于 2010-03-30T16:39:01.033 に答える