带有GC.SuppressFinalize的可finalizable对象是否与普通的不可finalizable对象相同?下面的代码似乎证明了它们在.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毫秒与889毫秒相比)。
我认为SuppressFinalize在object头中设置了一个位,使GC将该对象视为非finalizable对象,但事实似乎并非如此。那到底是怎么回事?非finalizable对象和调用了GC.SuppressFinalize的finalizable对象有什么不同?
发布于 2012-03-29 05:43:42
据我所知,CLR有一个为其注册了finalization的对象队列。实现终结器将把该类型的对象放到队列中。因此,在构造函数调用SuppressFinalize的情况下,我认为对象实际上被放到队列中只是为了立即删除,这可以解释开销。
https://stackoverflow.com/questions/9912981
复制相似问题