shuhelohelo’s blog

Xamarin.Forms多めです.

Nullを代入するということ

確認:

オブジェクトは参照型なので、以下のような「ある変数にオブジェクトのインスタンスを代入(しているような記述)」するというのはそのインスタンスへの参照(ポインタ)を代入するということ。

var a = new MyObject(10);

というのは、MyObjectのインスタンスがメモリ上に作られ、そこへの参照がaに代入されるということ。

ここで、

var b = a;

とすることの意味とは、aとbが同じものになるのではなく、aの中に入っているMyObjectのインスタンスへの参照をbにも代入するということ。

二つの変数a, bが同じオブジェクトを参照しているということ。

さて、

b = null;

としたとき、これは何を意味するのかというと、b内のMyObjectのインスタンスへの参照がなくなるだけで、MyObjectのインスタンス自体はメモリ上に存在している。

なので、aがnullになるわけではない。aは依然としてMyObjectのインスタンスへの参照を持っていて、インスタンスにアクセスできる。

もしここで、a = nullも行えば、MyObjectのインスタンスを参照するものはなくなり、そのインスタンスはいずれガベージコレクタによってメモリから消される。

    class Program
    {
        static void Main(string[] args)
        {
            var a = new MyObject(10);

            var b = a;

            Console.WriteLine($"a: {a.MyInt}");//10
            Console.WriteLine($"after b=a b: {b.MyInt}");//10

            b.MyInt = b.MyInt - 5;

            Console.WriteLine($"after b-5 a: {a.MyInt}");//5
            Console.WriteLine($"after b-5 b: {b.MyInt}");//5

            b = null;

            Console.WriteLine($"after b=null a: {a.MyInt}");//5
            Console.WriteLine($"after b=null b: {b?.MyInt}");//nullの場合は何も表示されないようにしている
        }
    }

    class MyObject
    {
        public MyObject(int value)
        {
            MyInt = value;
        }
        public int MyInt { get; set; }
    }

nullを代入するということはオブジェクトを消すということではない。オブジェクトへの参照を消すということ。