Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
null合体演算子 ?? / ??=
値が null のときに代わりのデフォルト値を返す『??(null合体演算子)』と、null のときだけ代入する『??=』、null チェックつきでメンバーにアクセスする『?.(null条件演算子)』です。
構文
// null なら右辺の値を返します。 var 結果 = 変数 ?? デフォルト値; // null のときだけ右辺を代入します。 変数 ??= デフォルト値; // null チェックつきでメンバーにアクセスします(null なら null を返します)。 var 値 = オブジェクト?.プロパティ; var 値 = オブジェクト?.メソッド(); // ?. と ?? を組み合わせます。 var 値 = オブジェクト?.プロパティ ?? デフォルト値;
演算子一覧
| 演算子 | 概要 |
|---|---|
| a ?? b | a が null でなければ a を、null であれば b を返します。 |
| a ??= b | a が null のときだけ b を a に代入します。a が null でなければ何もしません。 |
| a?.b | a が null でなければ a.b を返します。a が null なら null を返します(例外なし)。 |
| a?[i] | a が null でなければ a[i] を返します。 |
| a?.b?.c | チェーンして複数の null チェックをまとめられます。 |
サンプルコード
using System;
// ?? でデフォルト値を設定します。
string 名前 = null;
string 表示名 = 名前 ?? "ゲスト";
Console.WriteLine(表示名); // ゲスト
string 別名 = "田中";
Console.WriteLine(別名 ?? "ゲスト"); // 田中
// ??= で null のときだけ代入します。
string キャッシュ = null;
キャッシュ ??= "初期値";
Console.WriteLine(キャッシュ); // 初期値
キャッシュ ??= "上書きされない";
Console.WriteLine(キャッシュ); // 初期値(null でないので変わらない)
// ?. で null チェックつきアクセスをします。
string テキスト = null;
int? 文字数 = テキスト?.Length; // null でも例外が発生しません。
Console.WriteLine(文字数); // (空白・null の出力)
string 実テキスト = "Hello";
Console.WriteLine(実テキスト?.Length); // 5
Console.WriteLine(実テキスト?.ToUpper()); // HELLO
// ?. と ?? を組み合わせます。
string 入力 = null;
int 長さ = 入力?.Length ?? 0;
Console.WriteLine(長さ); // 0
// クラスで使う例です。
class ユーザー { public string 住所 { get; set; } }
ユーザー user = null;
string 住所 = user?.住所 ?? "住所未登録";
Console.WriteLine(住所); // 住所未登録
概要
『??』と『?.』を組み合わせることで、null チェックの if 文を大幅に減らせます。if (obj != null) return obj.Value; else return default; のような冗長なコードを1行で書けます。
値型(int・bool など)を null 許容にしたい場合は『Nullable<T> / null許容型』を参照してください。型の判定と変換は『is / as / パターンマッチ』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。