hakeの日記

Windows環境でプログラミングの勉強をしています。

C# - Null許容型とNull合体演算子

Null許容型

通常は参照型の変数にしかnullは代入できないが、値型の変数でnull値を使いたい場合に使用する。内部的にはnullか否かのフラグと値を保持する変数を持っていると思われます。
値を保持しているか否かの判断には HasValue プロパティを利用する。値へのアクセスはそのままアクセスするか Vlaue プロパティを使用する。
通常型との変換については、通常型から許容型へはそのまま代入可能。許容型から通常型へはキャストが必要となる。ただしnull値の場合は実行時エラーとなるので事前に null か否かの判定は必須となる。
許容型同士の演算では、項に一つでも null値が存在すれば、結果は null となる。

using System;

//null許容型(nullable)


class MyMain
{
    static void Main(string[] args)
    {
        int? n1 = null;
        int? n2 = 123;
        int? n3;
        
        Console.WriteLine("n1 has value? : {0}", n1.HasValue);//False
        //Console.WriteLine("n1 value is   : {0}", n1.Value);  //実行時エラー
        Console.WriteLine("n1 is         : {0}", n1); //表示されない
        Console.WriteLine("n2 has value? : {0}", n2.HasValue);//True
        Console.WriteLine("n2 value is   : {0}", n2.Value);   //123
        Console.WriteLine("n2 is         : {0}", n2);         //123

        //通常型との型変換
        //
        int d1 = 456;
        int d2;
        n1 = d1;
        Console.WriteLine("n1 is         : {0}", n1); //456
        //通常型への変換はキャストが必要
        //d2 = n1; //エラー
        d2 = (int)n1;
        Console.WriteLine("d1 is         : {0}", d1); //456
        //nullを変換すると
        n1 = null;
        //d2 = (int)n1; //実行時エラー

        //double型
        //
        double? f1 = null;
        Console.WriteLine("f1 has value? : {0}", f1.HasValue);//False
        f1 = 456.789;
        Console.WriteLine("f1 has value? : {0}", f1.HasValue);//True
        Console.WriteLine("f1 value is   : {0}", f1.Value);   //456.789
        Console.WriteLine("f1 is         : {0}", f1);         //456.789


        //演算
        //
        n1 = null;
        n2 = null;
        //null + null
        n3 = n1 + n2;
        Console.WriteLine("n3(null + null) has value? : {0}", n3.HasValue); //False
        n1 = 1;
        //null + val
        n3 = n1 + n2;
        Console.WriteLine("n3(val  + null) has value? : {0}", n3.HasValue); //False
        n2 = 2;
        // val + val
        n3 = n1 + n2;
        Console.WriteLine("n3(val  + val ) has value? : {0}", n3.HasValue); //True
        Console.WriteLine("n3 is         : {0}", n3);
    }
}

 

Null合体演算子(??)

左項(A)を評価し null でなければその値を、nullであれば右項(B)の評価結果を返す。

    A ?? B
  • なお、C# 6では Null条件演算子というものも追加されたようです。

 

using System;

//null 合体演算子

class MyMain
{
    static void Main(string[] args)
    {
        int? d1 = null;
        int? d2 = 123;

        Console.WriteLine(d1 ?? -1); // -1
        Console.WriteLine(d2 ?? -1); // 123
    }
}