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を出力しました。めでたしめでたし。