Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Nullable<T> / null許容型

Nullable<T> / null許容型

通常はnullを持てない値型(int・bool・DateTimeなど)をnull許容にする『Nullable<T>』(短縮記法は『T?』)です。

構文
// null 許容の int を宣言します。
int? 変数 = null;
Nullable<int> 変数 = null; // 上と同じです。

// null でなければ値を取得します。
int 値 = 変数 ?? デフォルト値;
int 値 = 変数.GetValueOrDefault(デフォルト値);

// null か確認します。
bool 結果 = 変数.HasValue;

// 値を取り出します(null の場合は例外が発生します)。
int 値 = 変数.Value;
メンバー一覧
メンバー概要
.HasValue値が設定されているかどうかを bool で返します。null なら false になります。
.Value値を取り出します。HasValue が false のときに呼ぶと例外が発生します。
.GetValueOrDefault()値があればその値を、null なら型のデフォルト値(int なら 0)を返します。
.GetValueOrDefault(T val)null のときに返すデフォルト値を指定できます。
変数 ?? デフォルトnull のときにデフォルト値を返す null 合体演算子です。
サンプルコード
using System;

// int? で null 許容の整数を扱います。
int? 得点 = null;
Console.WriteLine(得点.HasValue);              // False
Console.WriteLine(得点.GetValueOrDefault(-1)); // -1

得点 = 85;
Console.WriteLine(得点.HasValue);  // True
Console.WriteLine(得点.Value);     // 85
Console.WriteLine(得点 ?? 0);      // 85

// null 許容型のまま計算できます。
int? a = 10;
int? b = null;
int? 合計 = a + b; // null が含まれると結果も null になります。
Console.WriteLine(合計.HasValue); // False

// DateTime? で日付の未入力状態を表現します。
DateTime? 生年月日 = null;
if (!生年月日.HasValue) {
	Console.WriteLine("生年月日は未設定です。");
}

生年月日 = new DateTime(1990, 4, 1);
Console.WriteLine($"生年月日: {生年月日?.ToString("yyyy/MM/dd")}"); // ?. で安全にアクセス

// null 許容型の比較です。
int? x = 5;
int? y = null;
Console.WriteLine(x > 3);  // True
Console.WriteLine(y > 3);  // False(null との比較は常に false)
Console.WriteLine(y == null); // True
概要

『T?』(Nullable<T>)はデータベースのNULL値や「未入力」状態を表すのに便利です。例えばアンケートの「回答なし」、日付フィールドの「未設定」などを null で表現できます。

null 許容型の値を通常の値型に変換するには ?? 0 などで明示的なデフォルト値を指定するか、.GetValueOrDefault() を使います。チェックなしに『.Value』を呼ぶと InvalidOperationException が発生します。

null 安全なアクセスには『null合体演算子 ?? / ??=』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。