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を代入するということはオブジェクトを消すということではない。オブジェクトへの参照を消すということ。