Это трудно объяснить, фактический код CLR не очень хорошо соответствует описаниям, которые вы найдете в литературе .NET, и он довольно запутанный. Внутри CLR действительно есть одна логическая структура с именем «finalization_queue». Однако он имеет внутреннюю структуру, которая организует финализуемые объекты по поколениям.
Есть лучший способ показать это. Если ваше предположение верно, не будет никакого способа, чтобы объект мог быть завершен после коллекции # 0 поколения. Попробуйте:
using System;
class Program {
static void Main(string[] args) {
var obj = new Test();
obj = null;
Console.WriteLine("before gen#0 collection");
GC.Collect(0);
GC.WaitForPendingFinalizers();
Console.WriteLine("after gen#0 collection");
Console.ReadLine();
}
}
class Test {
~Test() { Console.WriteLine("finalized"); }
}