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);
}
}
添加终结器但不更改任何其他内容会导致代码花费更长的时间(12601 ms与889 ms相比)。
我认为SuppressFinalize在对象标题中设置了一点,使GC将对象视为与非终结对象相同,但似乎并非如此。发生什么了?在调用GC.SuppressFinalize的情况下,非终结对象和可终结对象之间有什么不同?
答案 0 :(得分:8)
据我了解,CLR有一个已注册终结的对象队列。实现终结器会将类型的对象放在队列中。因此,在构造函数调用SuppressFinalize
的情况下,我想象对象实际上只是被放在队列中才能立即删除,这可以解释开销。