ホームに戻る
出典 :
目次 :
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 でないオブジェクトがありません。" );