Ken*_*rey 4 c# garbage-collection destructor finalizer
在聊天的讨论过程中,我编写了这个控制台应用程序.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Collecting... Done
Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at SomeClass.Finalize()
Run Code Online (Sandbox Code Playgroud)
我本来以为应用程序在 Done
打印前会崩溃.
我不太关心如何制作它.我的问题是,为什么不呢?
max*_*max 12
具有终结器的对象无法在单个垃圾收集过程中收集.这些对象被移动到f-reachable
队列中,并保持在那里直到调用终结器.只有在那之后它们才能被垃圾收集.
以下代码更好,但您不应该依赖它:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
此外,即使出于测试目的,在终结器中抛出异常似乎对我来说太残酷了.
此外,终结器的有趣副作用:具有终结器的对象仍然可以"自我复活"(有效地防止自身的垃圾收集),如果this
在终结器中存储引用(将其分配给某个静态变量).