以下に示すコードがあります。面接で聞かれた
object global;
void f()
{
object local=new object();
global=local;
}
彼は、「グローバルnull
は機能の外にあるのか?」と尋ねました。変数は関数の外でスコープを失い、local
その参照が与えられるglobal
ので、そうあるべきnull
ですが、そうではありませんか?
変数と値を区別する必要があります。
ローカル変数は関数の内部にのみ存在しますが、それは変数に含まれる値が関数の外部に存在しないことを意味するものではありません。
local
の値をに割り当てるglobal
と、同じオブジェクトへの2つの参照が存在するように、オブジェクトへの参照がコピーされます。関数を終了するとローカル変数は消えますが、グローバル変数にコピーした値は引き続き存在し、オブジェクトへの参照が残っているため、オブジェクトは存続します。
この質問に関して多くの調査を行ったところ、この動作の唯一の理由は .Net ガベージ コレクションによるものであることがわかりました。
GC ルート自体はオブジェクトではなく、オブジェクトへの参照です。GC ルートによって参照されるすべてのオブジェクトは、次のガベージ コレクションで自動的に存続します。
local はローカル変数であるため、GC ルートにとどまり、グローバルによって参照されるため、GC を存続します。詳細については、
http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/