情况:
- 对象符合 GC 条件
- GC 开始收集
- GC 调用析构函数
- 例如,在析构函数 I 中,将当前对象添加到静态集合中
在收集对象的过程中变得不符合 GC 的条件,并且将来会符合条件,但在规范中说 Finalize 只能被调用一次。
问题:
- 对象会被销毁吗?
- 会在下一次 GC 上调用 finalize 吗?
该对象不会被垃圾回收 - 但下次它有资格进行垃圾回收时,终结器将不会再次运行,除非您调用GC.ReRegisterForFinalize
.
示例代码:
using System;
class Test
{
static Test test;
private int count = 0;
~Test()
{
count++;
Console.WriteLine("Finalizer count: {0}", count);
if (count == 1)
{
GC.ReRegisterForFinalize(this);
}
test = this;
}
static void Main()
{
new Test();
Console.WriteLine("First collection...");
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Second collection (nothing to collect)");
GC.Collect();
GC.WaitForPendingFinalizers();
Test.test = null;
Console.WriteLine("Third collection (cleared static variable)");
GC.Collect();
GC.WaitForPendingFinalizers();
Test.test = null;
Console.WriteLine("Fourth collection (no more finalization...)");
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
输出:
First collection...
Finalizer count: 1
Second collection (nothing to collect)
Third collection (cleared static variable)
Finalizer count: 2
Fourth collection (no more finalization...)