具有GC.SuppressFinalize的可终止对象和普通不可终止对象是否相同?以下代码似乎证明它们在.NET 2和4上被不同对待:
class Class1 {
public Class1()
{
GC.SuppressFinalize(this);
}
//~Class1() { }
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i=0; i<100000000; i++)
{
new Class1();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
}
仅添加 finalizer 而不更改其他内容会导致代码运行时间大大增加(从 889ms 增加到 12601ms)。
我之前以为在对象头部设置一个位来使 GC 将具有 finalizer 的对象视为非 finalizable 对象,但这并不是事实。那么出了什么问题?GC.SuppressFinalize 方法调用前后在不具有 finalizer 和具有 finalizer 的对象之间的区别是什么?
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
所需的时间。使用或不使用(被抑制的)终结器没有明显的差异。 - dlf