7

合体演算子を含む、少なくとも 2 つの一般的な C# イディオムは誰もが知っています。

シングルトンのもの:

return _staticField = _staticField ?? new SingletonConstructor();

そしてチェーン1:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType);

読みやすく、一貫性があり、使用する価値があり、コードで認識できます。

しかし、残念ながらこれだけです。場合によっては、拡張または変更が必要になります。時々、特定のケースを見たときにそれらを使用しますが、他のプログラマーが本当に簡単に読めるかどうかわからないため、常に使用するのをためらっています。

他に知っている人はいますか?Asp.net、EF、LINQなど、合体が許容されるだけでなく注目に値するものなど、より具体的な使用法があれば幸いです。

4

2 に答える 2

6

私にとって、それがSQLに変換される場所は、それ自体で十分です。

from a in DB.Table
select new {
             a.Id,
             Val = a.One ?? a.Two ??a.Three
           }

これによりCOALSCE、データベース側で非常にクリーンなSQLが作成され、ほとんどの場合、優れた代替手段はありません。私たちはOracleを使用していますNvl(Nvl(Nvl(Nvl(。ネストしていただきありがとうございますが、読みたくありません...私を連れてCOALSCE実行します。

私はこのようなプロパティにも使用しますが、個人的な好みだと思います。

private string _str;
public string Str { 
  get { return _str ?? (_str = LoaderThingyMethod()); } 
}
于 2010-02-24T23:20:17.937 に答える
4

C# 2.0 で null 合体演算子が導入された理由は、null 許容型に既定値を割り当てて null 許容型を null 非許容型に簡単に変換できるようにするためでした。変換がなければ??、長いifステートメントが必要になります。次の引用はMSDNからの引用です。

null 許容型には、値を含めることも、未定義にすることもできます。?? 演算子は、null 許容型が非 null 許容型に割り当てられたときに返されるデフォルト値を定義します。?? 演算子を使用すると、コンパイル時エラーが発生します。キャストを使用し、null 許容値の型が現在定義されていない場合、InvalidOperationException 例外がスローされます。

次の単純化は「注目に値する」と考えるかもしれません。

int? x = null;
int y = x ?? -1;

それ以外の

int? x = null;
int y = -1;

if (x.HasValue)
{
    y = x.Value;
}
于 2010-02-24T23:36:30.667 に答える