ZerOx4Cの日記だったもの

インポートだけしました

nullの扱い

凄くレベルの低いメモ。今後のために。


ややこしい状況(そうでもない)だけど、

class FooClass {
    // コンストラクタでも何でもいいけど関数
    public FooClass() {
        BarClass
            bar1 = new BarClass(),
            bar2 = null;

        bar1.i = 50;  // 1
        bar2 = bar1;  // 2
        bar1.i = 100; // 3
        bar2 = null;  // 4
    }
}

class BarClass {
    public int i { get; set; }
}


こんなコードがあったとして、
「// 1」ではただbar1.iに50を代入しているだけなので、bar2はnullのままです。
「// 2」で、bar2にbar1が代入されています。BarClassは参照型なので、bar2にはbar1のアドレスが入って、bar2 == bar1となります。
「// 3」で、bar1.iに100を代入したので、bar1と同じアドレスを指しているbar2.iも100になります。

問題は「// 4」。
「bar2にnullを代入したので、bar2と同じアドレスを指すbar1もnullになる」と思っていたんですけど、試してみたら違うんですね。
つまり、「bar2にnullを代入したら、bar2の参照先のアドレスがnullになった」→「nullはnull pointer」→「ぬるぽ」というわけ。最後のは要らないガッ。
ということは、nullになってるオブジェクトは全部同じアドレス(ぬるぽ)を指しているということになる?


試しに書いたコード↓

    class HogeClass {
        public HogeClass() {
            // どちらもnullを参照させる
            FooClass foo = null;
            BarClass bar = null;

            // 型が違うのでobjectとして比較
            Console.WriteLine(foo as object == bar as object);
        }
    }

    class FooClass { }
    class BarClass { }


Trueを出力しました。めでたしめでたし。