2

以下に示すコードがあります。面接で聞かれた

object global;
void f()
{
  object local=new object();
  global=local;
}

彼は、「グローバルnullは機能の外にあるのか?」と尋ねました。変数は関数の外でスコープを失い、localその参照が与えられるglobalので、そうあるべきnullですが、そうではありませんか?

4

2 に答える 2

10

変数と値を区別する必要があります。

ローカル変数は関数の内部にのみ存在しますが、それは変数に含まれる値が関数の外部に存在しないことを意味するものではありません。

localの値をに割り当てるglobalと、同じオブジェクトへの2つの参照が存在するように、オブジェクトへの参照がコピーされます。関数を終了するとローカル変数は消えますが、グローバル変数にコピーした値は引き続き存在し、オブジェクトへの参照が残っているため、オブジェクトは存続します。

于 2012-04-18T06:25:23.813 に答える
0

この質問に関して多くの調査を行ったところ、この動作の唯一の理由は .Net ガベージ コレクションによるものであることがわかりました。

GC ルート自体はオブジェクトではなく、オブジェクトへの参照です。GC ルートによって参照されるすべてのオブジェクトは、次のガベージ コレクションで自動的に存続します。

local はローカル変数であるため、GC ルートにとどまり、グローバルによって参照されるため、GC を存続します。詳細については、

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

于 2012-04-20T04:34:55.833 に答える