2005年C#の旅その1

VC#2005 Expressでしばらく遊んでみようと思います。今回は、昨日話題に出したNullable Typeについて。Nullable Typeとはその名の通り、nullになりうる型です。現状、C#では値型にnull値を取ること出来ません。つまり「値がない」を表現することが出来ません。もちろん、object型の変数にBoxingして入れておけば可能ですが取り出す場合にキャストが必要となり、型安全から考えると好ましくありません。ちなみにint?とかはシンタックスシュガーでNullableと書けば同じ意味です。現状、Nullable Typeが無くて困ったことがないので言語に盛り込まなくてもクラスライブラリで十分だったと思うのですが、データベース関連のプログラミングが多くなると便利なのかもしれません。

では、簡単な使用例を見てみます。

#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 */

使っていくうちに違和感は無くなるかも知れませんね。