【C#】Nullable型(?)とnull合体演算子(??)の活用方法

C# では値型は通常 null を保持できません。しかし「Nullable型」を使うことで値型にも null を扱えるようになります。また「null合体演算子(??)」を使うと、null の場合に代替値を設定できるため、コードを簡潔に記述できます。本記事ではこれらの使い方を解説します。

Nullable型とは?

値型(int, double, bool など)に ? を付けると「Nullable型」となり、通常の値に加えて null を代入できます。

int? number1 = null; // null を保持可能
int? number2 = 10;

Console.WriteLine(number1.HasValue); // False
Console.WriteLine(number2.HasValue); // True
Console.WriteLine(number2.Value);    // 10

HasValue プロパティで値があるかを判定し、Value プロパティで値を取り出せます。

Nullable型の安全な取り出し

Nullable型を直接 Value で取り出すと、null の場合に例外が発生します。そのため、GetValueOrDefault() を使うと安全にデフォルト値を取得できます。

int? number = null;

Console.WriteLine(number.GetValueOrDefault());     // 0(int のデフォルト値)
Console.WriteLine(number.GetValueOrDefault(100));  // 100(指定したデフォルト値)

null合体演算子(??)

?? は「左辺が null の場合に右辺の値を使う」という演算子です。Nullable型と組み合わせると非常に便利です。

int? number = null;

// null の場合は 50 を代入
int result = number ?? 50;

Console.WriteLine(result); // 50

null条件演算子(?.)との組み合わせ

?. 演算子を使うと、オブジェクトが null の場合にメンバーアクセスをスキップできます。さらに ?? と組み合わせると、null のときにデフォルト値を返せます。

string text = null;

// null の場合は "未設定" を返す
string result = text?.ToUpper() ?? "未設定";

Console.WriteLine(result); // 未設定

実用例:データベースや入力値の扱い

データベースの数値やユーザー入力など、値が存在しない可能性のある場面で Nullable型と ?? は役立ちます。

int? dbValue = null;

// データが null の場合は 0 を利用
int displayValue = dbValue ?? 0;

Console.WriteLine($"表示用の値: {displayValue}");

まとめ

C# の Nullable型と null合体演算子は、null を安全かつシンプルに扱うための重要な機能です。

  • int? などで値型に null を許容できる
  • HasValue / GetValueOrDefault で安全に値を確認・取得できる
  • ?? で null の場合に代替値を指定できる
  • ?. と組み合わせるとさらに便利

null が絡む処理はバグの原因になりやすいため、Nullable型と ?? を活用して堅牢なコードを心がけましょう。