導入
nullチェックをifで毎回書くのは冗長です。?.(null条件演算子)と??(null合体演算子)を使うと、nullの扱いを1行で安全に書けます。
図解
flowchart LR
A["user?.Name"] -->|user が null なら| N1["結果も null(例外にならない)"]
A -->|user があれば| N2["Name を取得"]
B["name ?? "名無し""] -->|name が null なら| D[""名無し" を使う"]
B -->|name があれば| V["name をそのまま使う"]
サンプル
string? input = null;
// ?? : 左が null なら右の既定値を使う(null合体演算子)
string name = input ?? "名無し";
Console.WriteLine(name); // 名無し
// ?. : 左が null なら、メソッド/プロパティにアクセスせず null を返す(例外を防ぐ)
string? text = null;
int? length = text?.Length; // text が null なので length も null(例外にならない)
Console.WriteLine(length ?? 0); // 0
// 組み合わせ: null なら 0 文字扱い
string? maybe = "hello";
Console.WriteLine(maybe?.Length ?? 0); // 5
??(null合体):A ?? Bは「AがnullでなければA、nullならB」?.(null条件):x?.Memberは「xがnullなら、アクセスせずnullを返す」——NullReferenceExceptionを防ぐ?.と??を組み合わせると「nullなら既定値」を簡潔に書ける
演習
string? username = null;
// TODO: ?? を使って、username が null なら "ゲスト" を表示名 display に入れて出力してください
___
- 期待される出力:
ゲスト
ヒント1を見る
string display = username ?? "ゲスト";
ヒント2を見る
Console.WriteLine(username ?? "ゲスト");
まとめ
??は「nullなら既定値」を1行で書ける?.は「nullならアクセスせずnull」を返し、例外を防ぐ- 2つを組み合わせるとnull処理が簡潔で安全になる
次章: エラーメッセージを読み解き、バグを突き止める「エラーとデバッグ」へ進みます。