C#の値型でもnullを扱えるようにするNullable

C#の変数には値型参照型との2つのタイプが存在します。

 

「値型」は構造体(struct) です。

 (int や double といった数値型は実は構造体で定義されているので値型です)

 「参照型」はクラス(class)配列です。

 

※詳しくはC#の値型と参照型の違いをご覧ください

  

 

参照型では null という状態(無効な値、参照先が無い、実体が無いような状態)を表す事が出来ますが、値型ではそれが出来ません。

値型だけど null を扱いたいという時に登場するのが Nullable です。


nullを扱える値型の変数を定義する

System.Nullable<T> 構造体は値型に null を許容させるための物です。

ジェネリック型で定義されているので <T> の部分を <int> にしたり <double> にして使います。

 

※ジェネリックについてはC#のジェネリックを使おうをご覧ください

 

Nullable<T>

以下の例は Nullable を使った int 型の変数を定義しています。

数値の 100 を格納する事に加えて、null にする事も出来るようになります。

    Nullable<int> n;

    n = 100;
    n = null;

? を使った Nullable を省略した書き方

? をつかって Nullable を省略した書き方にする事も可能です。

Nullable<int>int? と同じ意味になります。

    int? n;

    n = 100;
    n = null;

Nullable<T>の演算

Nullable<T>は普通の値型のように演算する事が出来ます。

但し、演算結果が null になる事がある為、結果を受ける変数も Nullable<T> である必要があります。

    int? x = 100;
    int? y = 5;

    int? n = x + y;

算術演算

    n = x + y;
    n = x - y;
    n = x * y;
    n = x / y;
    n = x % y;

x と y 共に値が入っていれば演算結果の値が n へ格納されます。

x と y どちらか(もしくは両方)が null な時は n も null になります。

 


ビット演算

    n = x & y;
    n = x | y;
    n = x ^ y;
    n = x << y;
    n = x >> y;
    n = ~x;

x と y 共に値が入っていれば演算結果の値が n へ格納されます。

x と y どちらか(もしくは両方)が null な時は n も null になります。

 

x と y が bool? の場合に限り & と | は以下のような結果になります。

n = x & y    n = x | y
true   true   true    true   true   true
false   true   false   true   true   false
null   true   null   true   true   null
false   false   true   true   false   true
false   false   false   false   false   false
false   false   null   null   false   null
null   null   true   true   null   true
false   null   false   null   null   false
null   null   null   null   null   null

比較演算(等値比較)

    if (x == y)
    if (x != y)

x と y 共に値が入っていれば値の比較結果となります。

x と y 両方が null な時は等しいと判断します。(==の時はtrue、!=の時はfalse)

x と y 片方だけが null な時は等しくないです。==の時はfalse、!=の時はtrue


比較演算(等値比較以外)

    if (x <  y)
    if (x <= y)
    if (x >  y)
    if (x >= y)

x と y 共に値が入っていれば値の比較結果となります。

x と y どちらか(もしくは両方)が null な時は false と判断します。


 

関連記事