none
IDisposable e Destructor RRS feed

  • Pergunta

  • Boa Noite Pessoal,

    Tenho uma dúvida em relação a este código que eu encontrei

     public class Calculator : IDisposable
        {
            // Campos
            private bool disposed = false;
            // Construtores e Destrutores.
            public Calculator()
            {
                Console.WriteLine(":: Calculator being created");
            }
    
            ~Calculator()
            {
                Console.WriteLine(":: Calculator being finalized");
                this.Dispose();
            }
    
            public void Dispose()
            {
                if (!this.disposed)
                {
                    Console.WriteLine(":: Calculator being disposed");
                }
                this.disposed = true;
                GC.SuppressFinalize(this);
            }
    }

    A minha dúvida é sobre o uso do destruidor, pois pelo que eu sei ele não é recomendado por conta de entrar na Fila de Espera da Coleta de Lixo, mas só que ele colocou um método da Interface IDisposable, para poder ser usado em uma Using Keyword, se eu usar a Using ele não entrará no Destruidor por conta do método estatico GC.SuppressFinalize(this) ? então, ele não entra na coleta de lixo correto? então, o destruidor apenas parassará a ser chamado caso eu me esqueça de chamar o Using certo ? seria eficaz.. ?

    using ( Calculadora calculadora = new Calculadora())
    {
     //...
    }


    • Editado KDST segunda-feira, 10 de outubro de 2016 00:55
    segunda-feira, 10 de outubro de 2016 00:53

Respostas

  • A função do SuppressFinalize é marcar o objeto de modo que o CLR não execute a coleta redundante de lixo. Se você precisa liberar recursos gerenciados e/ou não gerenciados explicitamente (seja qual for a razão), isto é útil, do contrário seria trabalho desnecessário.

    Sobre entrar no destructor quando implementando IDisposable, ele é usado como uma "garantia" em casos onde o Dispose não é executado (ex: quando não é usado o bloco Using).


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta KDST terça-feira, 11 de outubro de 2016 16:57
    terça-feira, 11 de outubro de 2016 13:26