我有以下代码:
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()
.
在您的示例中,在集合期间不会调用终结器,因为它仍然由可终结队列生根.但是它计划完成,这意味着它将在下一次垃圾收集期间收集.
如果你想确保收集带有终结器的类型实例,你需要做两个这样的集合.
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
但通常你不应该Collect()
自己调用这个方法.