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