Como funciona a Interface IDisposable, do .NET ?

IDisposable

Numa aplicação em C/C++ tradicional o gerenciamento dos objetos na memória é feito pelo programador. Isto causa uma série de prejuízos por falhas humanas e grande perda na produtividade. O C# é uma linguagem que tira este trabalho do programador através do Garbage Collector do.NET.
O Garbage Collector consegue perceber objetos que não estão mais em uso e os limpa automáticamente. A limpeza da GC não pode ser provista pelo programador, e desta forma os objetos podem ficar por tempo indesejado na memória. Para resolver esta questão o uso da interface IDisposable é recomendável.
A Interface IDisposable possui apenas um método chamado void Dispose(). Este método possui instruções que limpam o objeto em questão da memória.
Os objetos que não são mais úteis em tempo de execução e que podem ser percebidos pelo programador devem ser dispostos, com uma chamada ao método Dispose() contido nele.
                Em .NET as classes podem ter destrutores. São métodos que são chamados automaticamente quando um objeto é destruído. Os destrutores não podem ser chamados diretamente numa aplicação. Existem 2 formas diferentes de se dispor objetos em .NET: disposição de recursos gerenciados e disposição de recursos não gerenciados.

Disposição de recursos gerenciados

Os recursos gerenciados são aqueles já possuem método de disposição próprio. Quando um objeto é disposto, os seus atributos gerenciados também devem ser dispostos. Numa classe que só tenha, por exemplo, um StreamReader. O Dispose deve fazer uma chamada ao método StreamReader.Dispose(). Este mesmo conceito vale para todos os objetos contidos na classe a ser disposta.

Disposição de recursos não gerenciados

Nem todos os objetos contidos numa classe são gerenciados e nem ela mesma. Desta forma, deve-se aplicar outros conceitos a classe para sua disposição. Um método privado void dispose(bool) deve existir para auxiliar nesta tarefa. Além disto, deve também existir um método externo chamado bool CloseHandle(IntPtr).

Veja um Exemplo

publicclass MeuRecurso: IDisposable
    {
        // Nunca deixe este método ser virtual.
        // As classes que herdarem desta devem utilizar este método para Dispose
        public void Dispose()
        {
            GC.SuppressFinalize(this);
        }
    }

Thiago Anselme
Thiago Anselme - Gerente de TI - Arquiteto de Soluções

Ele atua/atuou como Dev Full Stack C# .NET / Angular / Kubernetes e afins. Ele possui certificações Microsoft MCTS (6x), MCPD em Web, ITIL v3 e CKAD (Kubernetes) . Thiago é apaixonado por tecnologia, entusiasta de TI desde a infância bem como amante de aprendizado contínuo.

Deixe um comentário