9

状況:

  1. オブジェクトが GC の対象になる
  2. GC が収集を開始します
  3. GC 呼び出しデストラクタ
  4. たとえば、デストラクタIでは、現在のオブジェクトを静的コレクションに追加します

コレクションの過程でオブジェクトは GC の対象外になり、将来的には対象となりますが、仕様では Finalize は 1 回だけ呼び出すことができるとされています。

質問:

  1. オブジェクトは破壊されますか?
  2. finalize は次の GC で呼び出されますか?
4

1 に答える 1

12

オブジェクトはガベージ コレクションの対象になりませんが、次にガベージ コレクションの対象になった場合、 を呼び出さない限り、ファイナライザーは再度実行されません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...)
于 2012-12-30T12:10:31.490 に答える