この非常に単純なシナリオで、.netデストラクタが呼び出されないのはなぜですか?
-
03-07-2019 - |
質問
次のコードがあります:
public class A
{
~A()
{
Console.WriteLine("destructor");
}
}
public static A Aref;
static void Main(string[] args)
{
Aref = new A();
int gen = GC.GetGeneration(Aref);
Aref = null;
GC.Collect(gen, GCCollectionMode.Forced);
Console.WriteLine("GC done");
}
GC.Collectを呼び出すと、Finalizerメソッドが呼び出されると思いましたが、そうではありません。
誰が私に理由を説明できますか?
解決
GC.Collect()
が戻る前に、ファイナライザーは呼び出されません。ファイナライザは別のスレッドで実行されます- GC.WaitForPendingFinalizers()
を呼び出すことでファイナライザを待つことができます。
他のヒント
ファイナライザは、この例ではコレクション中に呼び出されません。これは、ファイナライズ可能なキューによってルート化されているためです。ただし、ファイナライズがスケジュールされているため、次のガベージコレクション中に収集されます。
ファイナライザを持つ型のインスタンスが確実に収集されるようにするには、このような2つの収集を行う必要があります。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
ただし、通常は自分で Collect()
メソッドを呼び出さないでください。
GCに収集を要求したとしても、この特定のオブジェクトが破棄されるかどうかは不明です(その時点で収集されている世代にない可能性があるため)
所属していません StackOverflow