null合体演算子 ?? / ??=
| 対応: | ?? | C# 2.0(2005) |
|---|---|---|
| ??= | C# 8.0(2019) |
値が null のときに代わりのデフォルト値を返す『??(null合体演算子)』と、null のときだけ代入する『??=』、null チェックつきでメンバーにアクセスする『?.(null条件演算子)』です。
構文
// null なら右辺の値を返します。 var result = 変数 ?? デフォルト値; // null のときだけ右辺を代入します。 変数 ??= デフォルト値; // null チェックつきでメンバーにアクセスします(null なら null を返します)。 var value = オブジェクト?.プロパティ; var value = オブジェクト?.メソッド(); // ?. と ?? を組み合わせます。 var value = オブジェクト?.プロパティ ?? デフォルト値;
演算子一覧
| 演算子 | 概要 |
|---|---|
| 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 チェックをまとめられます。 |
サンプルコード
Program.cs
using System;
// ?? でデフォルト値を設定します。
string name = null;
string displayName = name ?? "ゲスト";
Console.WriteLine(displayName); // ゲスト
string alias = "狡噛慎也";
Console.WriteLine(alias ?? "ゲスト"); // 狡噛慎也
// ??= で null のときだけ代入します。
string cache = null;
cache ??= "初期値";
Console.WriteLine(cache); // 初期値
cache ??= "上書きされない";
Console.WriteLine(cache); // 初期値(null でないので変わらない)
// ?. で null チェックつきアクセスをします。
string text = null;
int? length = text?.Length; // null でも例外が発生しません。
Console.WriteLine(length); // (空白・null の出力)
string realText = "Hello";
Console.WriteLine(realText?.Length); // 5
Console.WriteLine(realText?.ToUpper()); // HELLO
// ?. と ?? を組み合わせます。
string input = null;
int len = input?.Length ?? 0;
Console.WriteLine(len); // 0
// クラスで使う例です。
class Inspector { public string Name { get; set; } }
Inspector inspector = null;
string inspectorName = inspector?.Name ?? "未登録";
Console.WriteLine(inspectorName); // 未登録
dotnet script null_coalescing.csx ゲスト 狡噛慎也 初期値 初期値 5 HELLO 0 未登録
概要
『??』と『?.』を組み合わせることで、null チェックの if 文を大幅に減らせます。if (obj != null) return obj.Value; else return default; のような冗長なコードを1行で書けます。
値型(int・bool など)を null 許容にしたい場合は『Nullable<T> / null許容型』を参照してください。型の判定と変換は『is / as / パターンマッチ』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。