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 と判断します。

コメント
コメントを投稿