2

私は次のコードを持っています:

 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");

    }

Finalizer メソッドは GC.Collect の呼び出し時に呼び出されると思っていましたが、そうではありませんでした。

誰かが私に理由を説明できますか?

4

3 に答える 3

13

GC.Collect()ファイナライザーは、リターンの前に呼び出されません。ファイナライザーは別のスレッドで実行されます - を呼び出すことでそれらを待つことができますGC.WaitForPendingFinalizers()

于 2009-03-03T14:22:04.027 に答える
6

あなたの例では、コレクション中にファイナライザーは呼び出されません。これは、まだファイナライズ可能なキューによってルート化されているためです。ただし、ファイナライズがスケジュールされているため、次のガベージ コレクションで収集されます。

ファイナライザーを持つ型のインスタンスが確実に収集されるようにするには、次のように 2 つのコレクションを実行する必要があります。

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

ただし、一般に、Collect()メソッドを自分で呼び出すべきではありません。

于 2009-03-03T14:22:20.000 に答える
-2

GC に収集を依頼しても、この特定のオブジェクトが破棄されるかどうかは不明です (その時点で収集されている世代に存在しないため)。

于 2009-03-03T14:22:54.273 に答える