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 と判断します。
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください