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型と ??
を活用して堅牢なコードを心がけましょう。