在聊天讨论的过程中,我编写了这个控制台应用程序。
代码:
using System;
class Program
{
static void Main(string[] args)
{
CreateClass();
Console.Write("Collecting... ");
GC.Collect();
Console.WriteLine("Done");
}
static void CreateClass()
{
SomeClass c = new SomeClass();
}
}
class SomeClass
{
~SomeClass()
{
throw new Exception();
}
}
结果:
Collecting... Done
Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at SomeClass.Finalize()
我本以为应用会在 Done
打印出来之前崩溃。
我不太在乎怎么做。我的问题是,为什么不呢?
最佳答案
具有终结器的对象无法在单个垃圾回收过程中被回收。这些对象被移动到 f-reachable
队列,并保留在那里直到调用终结器。只有在那之后,它们才能被垃圾收集。
下面的代码更好,但无论如何你都不应该依赖它:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
此外,即使是出于测试目的,在终结器中抛出异常对我来说也太残酷了。
此外,终结器的有趣副作用:如果在终结器中存储 this
引用(将其分配给某个静态变量)。
关于c# - GC.Collect() 没有立即收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354086/