MOの気になることを適当に伝えるブログ

moNote

C#

C# - null

投稿日:

C#での null(ヌル)についての 説明

null

null は、どこも参照していないことを示す値です。 参照型の変数には既定値として null が代入されます。

    class Program
    {
        static void Main(string[] args)
        {
            myClass obj;
            obj.hello();
            Console.Read();
        }
    }

    class myClass
    {
        public void  hello() {
            Console.WriteLine("Heloo");
        }
    }

このコードをコンパイルすると

エラー	CS0165	未割り当てのローカル変数 'obj' が使用されました。

と 表示されて コンパイルできません。 これは null安全 な 言語では コンパイル時に obj が さにも参照していない null が代入された 状態で 16行目の処理をしないように チェックしてくれたからです。

    class Program
    {
        static void Main(string[] args)
        {
            myClass obj = new myClass();
            obj = null;

            obj.hello();         // エラー
            Console.Read();
        }
    }

ただし、上記のような場合は コンパイルは出来ます。 ただし実行時には  エラーになります。

    class Program
    {
        static void Main(string[] args)
        {
            myClass obj = new myClass();
            obj = null;

            if (obj != null)
                obj.hello();
            Console.Read();
        }
    }

上記のコードならエラーは 起きません。null 安全は 万能ではないので null の判定が必要なもは 基本的にするものだと考えた方がいいです。

null許容型

C# で null は参照してないことを示す値なので 参照型で使いますが、値型には 直接値が入っているため null という 考え方はありません。

それでも 値型に null を代入したい時は null許容型(Nulllable Type)を使います。

        static void Main(string[] args)
        {
            int? a = null;        // int型のNull許容型

            if (a == null)
                Console.WriteLine("Null");
            Console.Read();
        }
Null

null許容型のプロパティ

null許容型には HasValue と Value の 2つのプロパティを持っていて 
HasValue は null の 有無を(  false だと null ) 
Value には HasValue が True の 場合 は 値を返します。

        static void Main(string[] args)
        {
            int? a = 10;

            Console.WriteLine(a.HasValue);
            Console.WriteLine(a.Value);
            Console.WriteLine(a);
            Console.Read();
        }
True
10
10

型キャスト

null許容型の変数の値を 値型の変数に代入するときは 明示的は型キャストが必要です。 逆は必要ありません。

            int? a = 10;
            int b;

            b = (int)a + 5;    // 型キャストが必要
            a = b + 3;

null 合体演算子

?? 演算子は 左側が null ではない場合、左側のオペランドの値が返され、それ以外の場合(つまり 左側がnull の場合 )は、右側のオペランドが返されます。

int? a;
  ・・・・・・
int c = a ?? 0;

上記の3行目は、a が null で 無い場合は a の値が c に代入され 、a の値が null の場合は 0 が 代入されます。

-C#
-

Copyright© moNote , 2020 All Rights Reserved Powered by STINGER.