null許容型

    class Sample3
    {
        //null許容型のサンプル
        public Sample3()
        {
            //通常は値型の変数にはその型に沿った値が代入できる
            int x = 12;

            //インスタンス化すると暗黙的派生ValueType型のコンストラクタを通るため型に設定された規定値が代入された状態になる(この場合intなので0となる)
            int y = new int();

            int z;
            
            string str = "ABC";

            //zは未割り当てなので表示するとエラーになる
            //Console.WriteLine("{0} {1} {2}", x, y, z, str);

            Console.WriteLine("{0} {1} {2}", x, y, str);

            //値型にはnullは代入できない(0とnullは違う。0は値でありnullは"未定義"を指す。値型にnullを代入するとコンパイラーがエラーを出す)
            //int i = null;

            //そこでnull許容型を利用する。null許容型はSystem.Nullable<T> 構造体のインスタンスのこと
            //構文 T? は、Nullable<T> の省略表現です。ここで、T は値型です。この 2 つの形式はどちらでも使用できます
            //これにより通常の値のほかに「未定義(null)」という値をもてるようになる
            int? i = null;
            Nullable<int> ii = null;

            //nullかどうか調べる際のやり方1(HasValue は bool 型です。変数が null 以外の値を格納している場合、このプロパティには true が設定されます。)
            if (!i.HasValue) { Console.WriteLine("iの中身はnullです"); } else { Console.WriteLine(i.Value); }

            //暗黙の型変換によって通常の型の値は代入できる
            i = 12;

            //nullかどうか調べる際のやり方2
            if (i == null) { Console.WriteLine("iの中身はnullです"); } else { Console.WriteLine(i.Value); }

            //「int?」と「int」は違う型であり暗黙的な変換もできない
            //y += i;

            //その為、キャストによる明示的な変換が必要
            y += (int)i;
            Console.WriteLine("y= " + y);

            //キャストの変換を使用しない場合はvalueでも同じ事ができる
            y += i.Value;

            //null許容型は何時でもnullを設定できます
            i = null;

            //現在の値がnullであるnull許容型を、null非許容型に割り当てる場合、適用される既定値を割り当てるには、?? 演算子を使用します
            //この場合iがnullならば+5が規定値としてセットされ処理されます(iの値が5になるわけではない。iはあくまでnullのまま)
            x = i ?? +5;

            Console.WriteLine("x={0} : i={1}", x, i);
        }
    }


演算子


   class Sample4
   {
       public Sample4()
       {
           int? num1 = 10;
           int? num2 = null;

           //false どちらか片方でもnullがあればfalseになる。10 は null より大きくも小さくも等しくもありません。
           if (num1 >= num2)
           { Console.WriteLine("true"); } 
           else { Console.WriteLine("false"); }

           //false
           if (num1 < num2)
           { Console.WriteLine("true"); }
           else { Console.WriteLine("false"); }

           //true nullと値の違いは検出する
           if (num1 != num2)
           { Console.WriteLine("true"); }
           else { Console.WriteLine("false"); }

           //true
           num1 = null;
           if (num1 == num2)
           { Console.WriteLine("true"); }
           else { Console.WriteLine("false"); }
       }
   }
最終更新:2012年05月28日 22:33