2005年C#の旅その1
VC#2005 Expressでしばらく遊んでみようと思います。今回は、昨日話題に出したNullable Typeについて。Nullable Typeとはその名の通り、nullになりうる型です。現状、C#では値型にnull値を取ること出来ません。つまり「値がない」を表現することが出来ません。もちろん、object型の変数にBoxingして入れておけば可能ですが取り出す場合にキャストが必要となり、型安全から考えると好ましくありません。ちなみにint?とかはシンタックスシュガーでNullable
では、簡単な使用例を見てみます。
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
#endregion
namespace ConsoleApplication1
{
class Program
{
static void Swap(ref int? a, ref int? b)
{
int? t = a;
a = b;
b = t;
}
static int? Divide(int a, int b)
{
if (b == 0)
return null;
return a / b;
}
static void Main(string[] args)
{
// aはnull
int? a = null;
Console.WriteLine("a = {0}", a == null ? 0 : a.Value);
// aは10
a = 10;
Console.WriteLine("a = {0}", a == null ? 0 : a.Value);
// Valueプロパティは読み取り専用
// a.Value = 20; // コンパイルエラー
// ??演算子は対象がnullの場合、右辺の値を返す
a = null;
// aはnullなので10となる
a = a ?? 10;
Console.WriteLine("a = {0}", a);
// aはnullではないので、aの値(10)を返す
a = a ?? 20;
Console.WriteLine("a = {0}", a);
a = null;
int? b = 30;
Console.WriteLine("a = {0}, b = {1}", a, b);
// Nullable Typeは当然メソッドの引数にもなる
Swap(ref a, ref b);
Console.WriteLine("a = {0}, b = {1}", a, b);
// 戻り値にNullable Type
b = 0;
if (a != null && b != null)
Console.WriteLine("{0} / {1} = {2}",
a.Value, b.Value, Divide(a.Value, b.Value) ?? int.MaxValue);
}
}
}
/* 結果
a = 0
a = 10
a = 10
a = 10
a = , b = 30
a = 30, b =
30 / 0 = 2147483647 */
使っていくうちに違和感は無くなるかも知れませんね。