9

情况:

  1. 对象符合 GC 条件
  2. GC 开始收集
  3. GC 调用析构函数
  4. 例如,在析构函数 I 中,将当前对象添加到静态集合中

在收集对象的过程中变得不符合 GC 的条件,并且将来会符合条件,但在规范中说 Finalize 只能被调用一次。

问题:

  1. 对象会被销毁吗?
  2. 会在下一次 GC 上调用 finalize 吗?
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 回答