Является ли финализируемый объект с 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 мс по сравнению с 889 мс).
Я думал, что SuppressFinalize устанавливает бит в заголовке объекта, заставляя сборщик мусора рассматривать объект так же, как не подлежащий финализации объект, но, похоже, это не так. Так что же происходит? В чем разница между нефинализируемым объектом и финализируемым объектом с вызовом GC.SuppressFinalize?