Por que meu .net destructor não é chamado neste cenário muito simples?
-
03-07-2019 - |
Pergunta
Eu tenho o seguinte código:
public class A
{
~A()
{
Console.WriteLine("destructor");
}
}
public static A Aref;
static void Main(string[] args)
{
Aref = new A();
int gen = GC.GetGeneration(Aref);
Aref = null;
GC.Collect(gen, GCCollectionMode.Forced);
Console.WriteLine("GC done");
}
Eu pensei que meu método finalizador seria chamado a minha chamada para GC.Collect, o que não é o caso.
Alguém pode me explicar por quê?
Solução
Finalizadores não são chamados antes GC.Collect()
retornos. Os finalizadores são executados em um segmento separado -. Você pode esperar por eles chamando GC.WaitForPendingFinalizers()
Outras dicas
O finalizador não é chamado durante a coleta no seu exemplo, porque ele ainda está sendo enraizada pela fila finalizable. no entanto, está prevista para finalização, o que significa que serão coletados durante a próxima coleta de lixo.
Se você quiser ter certeza de que instâncias de tipos com um finalizador são recolhidas você precisa fazer duas coleções como esta.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Mas geralmente você não deve chamar o método Collect()
si mesmo.
Mesmo se você perguntar para o GC para coletar, ele não tem certeza de que este objeto específico serão destruídos (como não poderia ser na geração sendo coletadas naquele momento)