C# の Nullable 型
C# の値型と参照型
C# のデータ型は大きく分けて、値型 (value type) と参照型 (reference type) に分けられます。
値型は単に値を保持するだけものものです。int や float などのプリミティブデータ型は値型です。
一方、参照型はオブジェクトを指し示すための変数です。オブジェクトがメモリ上に作成された時に、 メモリ上の場所を表します。参照型の変数にまだ、指し示すオブジェクトが指定されていない状態の時に null という値になります。
C# の Nullable 型
C# は値型の型に ? を付けることで、 null となることができる型にすることができます。これを Nullable 型といいます。
int? m = null;
m = 10;
Console.WriteLine($"m={m}"); // m=10
int 型の他にも同様に、 ? を付けることで Nullable 型にできます。
C# の Nullable<T> 構造体
型名に ? を付けた、 T? は Nullable<T> 構造体として作成されます。
Nullable<int> m = null; // int? m = null
Nullable<T> 構造体は Value プロパティや HasValue プロパティを持っています。
Value プロパティではセットされた値を返します。 HasValue プロパティは値がセットされている時に true、セットされていない時に false を返します。
int? m = null;
//m = 10;
if (m.HasValue) // m != null
{
Console.WriteLine($"m={m}");
}
else
{
Console.WriteLine("no value assigned");
}
Nullable の変数に値がセットされているかどうかは、必ずしも HasValue プロパティをチェックする必要はなく、 == 演算子や != 演算子を用いて null であるかチェックできます。