Nullable<>型で遊んでみた

値型のオブジェクトを未定義状態にしておきたい場合がある。いままで、このような場合は既定値を与えることで対処してきた。大抵の場合はこの方法でうまくいくが、この方法だと一度も値が代入されていない状態とそうでない状態を明確に区別することができないため、問題が発生する場合があった。

Nullable<>型はgenericsで提供される上記の問題への解決策である。例えば、int型のオブジェクトを未定義状態にしておきたい時、次のように書くことが可能だ。

Nullable foo = null;
foo = 10; // int型の値も代入できる

また、Nullable<>型は簡略して書くための文法が用意されており、次のように書くことができる。

int? foo = null;

ここでint?型は、nullとint型の値を取りうるため、int型の変数に代入する場合、次のように場合わけを記述しなければならない。

int? foo = null;
int bar;
if ( foo.HasValue )
   bar = foo.Value;
else
   bar = 10; // 10は既定値

または、

int bar = foo.HasValue ? foo.Value : 10;

と書ける。このステートメントもさらに簡略して書くことができ、

int bar = foo ?? 10;

となる。

個人的には、Nullable<>型は多用すると?が多すぎて、「コイツ自信がないんじゃないか?」と思われる可能性があるので注意が必要だと思った。

int? nullpo = null;
int orz = nullpo ?? 101;

こう書くとやる気を微塵も感じられない。さらに、日本語変数名を使うと、

bool そうだよ = true;
bool いやちがうって = false;
bool マジで= true;
bool? えっ = null;
bool orz = えっ ?? マジで ? そうだよ : いやちがうって;

とか、もう分けわかんない。寝ます。(記載したコードはコンパイラ通ることを確認済)