ページ

2004年5月21日金曜日

int? - Nullable

一部でうわさになっていた機能ですが、VS2005 CTP March 2004 で実装されていたんですね。全然気付いてなかったです(^^;


本来、値型は null という状態をとることはできません。C# の int も System.Int32 構造体のエイリアスなので、当然、値型です。なので表現できるのは整数値のみで null というのは表現できません。もし、値型も null を取れるようにすると値型の意味合いがかなり大きく変わってしまいます。しかし、そんなことをしなくても Generics を使えば 「null も表現できる値型」 が作れます。それが Nullable です。そして、C# では int? と型宣言をすると自動的に Nullable とコンパイルしてくれます(なので int? は単なるシンタックスシュガー)。


まぁ、以下のコードを見てもらえばわかるでしょう。


注意:某所の情報によると Nullable はなくなることはないと思いますが、int? が正式採用されるかどうかはまだ微妙みたいです。



int? i = null;
?
// 型名を表示(Nullable!1 とのこと)
Console.WriteLine(i.GetType().Name);
?
// null か確認
if (!i.HasValue)
{
    Console.WriteLine("!HasValue");
}
?
// null が確認
// ちなみになぜこれで動くかというと op_Implicit、すなわち implicit operator T (Nullable) が定義されているから。
if (i == null)
{
    Console.WriteLine("null");
}
?
// たとえ !HasValue であっても参照できる
// これも op_Implicit のおかげ。
if (i != 0)
{
    Console.WriteLine("i != 0");
}
?
// ただし !HasValue のときに Value を参照すると InvalidOperationException
//if (i.Value != 0)
//{
//    Console.WriteLine("i.Value != 0");
//}
?
// 整数を代入
i = 1;
?
// HasValue はもちろん true
Console.WriteLine(i.HasValue);
?
// i だけで参照。これも op_Implicit のおかげ。
Console.WriteLine("{0:d}", i);
Console.WriteLine(i.ToString());
?
// Value で参照
Console.WriteLine("{0:d}", i.Value);
Console.WriteLine(i.Value.ToString());

0 件のコメント:

コメントを投稿