【发布时间】:2013-12-22 16:46:52
【问题描述】:
这是一个展示令人惊讶的终结行为的示例程序:
class Something
{
public void DoSomething()
{
Console.WriteLine("Doing something");
}
~Something()
{
Console.WriteLine("Called finalizer");
}
}
namespace TestGC
{
class Program
{
static void Main(string[] args)
{
var s = new Something();
s.DoSomething();
GC.Collect();
//GC.WaitForPendingFinalizers();
s.DoSomething();
Console.ReadKey();
}
}
}
如果我运行程序,打印出来的是:
Doing something
Doing something
Called finalizer
这符合预期。因为在调用GC.Collect() 之后有对s 的引用,所以s 不是垃圾。
现在从//GC.WaitForPendingFinalizers(); 行中删除 cmets
再次构建并运行程序。
我希望输出不会发生任何变化。这是因为我读到如果发现对象是垃圾并且它有一个终结器,它将被放入终结器队列。由于对象不是垃圾,因此不应将其放入终结器队列似乎是合乎逻辑的。因此,注释掉的行应该什么都不做。
但是,程序的输出是:
Doing something
Called finalizer
Doing something
有人可以帮助我理解为什么调用终结器吗?
【问题讨论】:
标签: c# garbage-collection finalizer