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ê?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top