1

このコード行は、ヒープ上のメモリ領域をオブジェクト foo に割り当てます。

var foo =new object();

このコード行はそれを解放しますか?

foo=null;

それとも、ヒープ上のメモリ位置への参照を消去しているだけですか。

4

2 に答える 2

3

参照を削除するだけです。オブジェクト自体は、ランタイムが適切と判断したときにガベージ コレクションされ、参照が消去されるかどうかとは実際には無関係です。

于 2013-04-08T02:56:26.737 に答える
2

C# では、すべてのオブジェクトがガベージ コレクションされるため、それらを「削除」することはできません。

特定のオブジェクトへの最後の参照が範囲外になると、そのオブジェクトは収集されやすくなります。確かに、見つけられる限り多くの参照を null にすることができますが、参照がそのオブジェクトを保持している限り、オブジェクトは存続します。

したがってfoo=null;、参照を削除するだけです。

ガベージ コレクションは、次の手順で構成されます。

  1. ガベージ コレクターは、マネージ コードで参照されているマネージ オブジェクトを検索します。
  2. ガベージ コレクターは、参照されていないオブジェクトをファイナライズしようとします。
  3. ガベージ コレクターは、参照されていないオブジェクトを解放し、それらのメモリを再利用します。

ガベージ コレクターがどのように機能するかを理解することが重要ですGC クラス

// Set a break-point here to see that foo = null. 
// However, the compiler considers it "unassigned." 
// and generates a compiler error if you try to 
// use the variable.
object foo;
// Now foo has a value.
foo = new object();
// Set foo to null again. The object it referenced 
// is no longer accessible and can now be garbage-collected.
foo = null;
于 2013-04-08T02:58:21.773 に答える