ホームに戻る
出典 :
【ワレコC#】int?はNull許容型・ナンチャラ?.はNull条件演算子・??はNull合体演算子【ヌル三兄弟】 変数名の後ろに"?" がある - Null条件演算子の利用 - iPentec null合体演算子とnull条件演算子でショートコードプログラミング [C#] | JOHOBASE
目次 :

Null許容型

型名を ? で修飾することで、 Null許容型となる。
無修飾(本来)の値の型に加え、nullを格納できるようになる。

通常の型(int)
int value; // value は int 型であるため、null を格納できない ⇒ コンパイルエラー value = null;
Null許容型(int?)
// int を ? で修飾 ⇒ Null許容型 int? value; // value は int 型の値に加え、null を格納できる ⇒ 正常 value = null;

Null条件演算子

検査対象が null でない場合はメンバにアクセスし、null の場合は式全体の評価値が null となる
(代入式の左辺に用いることはできない?要調査。)
評価式 検査対象( object または array )の状態
非 null null
object.member object.member の値 評価不能(ヌルポインタ例外)
object?.member null
array[m] array[m] の値 評価不能(ヌルポインタ例外)
array?[m] null

Null合体演算子(Null結合演算子)

?? (Null合体演算子) の左辺値がnullでなければ左辺値をそのまま、nullの場合は右辺値を返すようにできる。
List<string> arr = null; : // len の値 : // arr?.Count != null ⇒ arr.Count // arr?.Count == null ⇒ 0 int len = arr?.Count ?? 0; // 以下のコードと等価 int len = (arr?.Count != null) ? arr.Count : 0;
複数連結することもでき、その場合は null でない最初の値を返す。
object ob1 = null; object ob2 = null; object ob3 = new object(); object ob4 = new object(); // ob3 を返す return ob1 ?? ob2 ?? ob3 ?? ob4;

Null合体・複合代入演算子

複合代入演算子として ??= も存在し、右辺値が非 null の場合のみ右辺値を代入する( null の場合は何もしない)。
string temp = String.Empty; // xxx.Name が null でなければ代入する temp ??= xxx.Name; // 以下のコードと等価 temp = xxx.Name ?? temp;

例外送出

最右辺項に限り、例外を送出することができる。
object ob1 = null; object ob2 = null; object ob3 = null; // ob1 , ob2 , ob3 のすべてが null のため、ObjectNullException が投げられる return ob1 ?? ob2 ?? ob3 ?? throw new ObjectNullException( "null でないオブジェクトがありません。" );