9
状況:デストラクタでオブジェクトへの参照を作成するとどうなりますか?
- オブジェクトがGCコレクション
- GCは、私は、例えば、静的なコレクションに現在のオブジェクトを追加し
デストラクタではデストラクタ
質問:
- が破壊されることは、オブジェクトのでしょうか?
- は、次のGCでファイナライズされますか?
状況:デストラクタでオブジェクトへの参照を作成するとどうなりますか?
デストラクタではデストラクタ
質問:
オブジェクトがは、ごみ収集されません - しかし、あなたはGC.ReRegisterForFinalize
を呼び出さない限り、それはガベージコレクションの対象です次回は、ファイナライザはは、再実行されることはありません。
サンプルコード:
using System;
class Test
{
static Test test;
private int count = 0;
~Test()
{
count++;
Console.WriteLine("Finalizer count: {0}", count);
if (count == 1)
{
GC.ReRegisterForFinalize(this);
}
test = this;
}
static void Main()
{
new Test();
Console.WriteLine("First collection...");
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Second collection (nothing to collect)");
GC.Collect();
GC.WaitForPendingFinalizers();
Test.test = null;
Console.WriteLine("Third collection (cleared static variable)");
GC.Collect();
GC.WaitForPendingFinalizers();
Test.test = null;
Console.WriteLine("Fourth collection (no more finalization...)");
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
出力:
First collection...
Finalizer count: 1
Second collection (nothing to collect)
Third collection (cleared static variable)
Finalizer count: 2
Fourth collection (no more finalization...)
.NET GC復活のために検索を行うには、例えば見つけます[この記事](http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) –