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

在您的示例中,在收集期间未调用终结器,因为它仍由可终结队列根植。然而,它已被安排完成,这意味着它将在下一次垃圾收集期间被收集。

如果要确保收集带有终结器的类型的实例,则需要像这样进行两次收集。

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

但通常您不应该Collect()自己调用该方法。

于 2009-03-03T14:22:20.000 回答
-2

即使您要求 GC 收集,也不确定该特定对象是否会被销毁(因为它不能在当时正在收集的一代中)

于 2009-03-03T14:22:54.273 回答