Lançando Exception quando Dispose não é chamado

Ao utilizar recursos não gerenciados, em .NET, precisamos garantir que estes sejam devidamente liberados. Para isso, quando criamos classes que alocam tais recursos, implementamos a interface IDisposable. Caberá ao programador que consome essa classe chamar o método Dispose que irá liberar tais recursos.

Infelizmente, muitas vezes, os programadores que consomem classes que alocam recursos não gerenciados esquecem de chamar o método Dispose. Assim, alguns recursos não gerenciados acabam pendurados por nossa aplicação gerando erros difíceis de identificar e corrigir. Uma abordagem interessante para minimizar esse risco é implementada a seguir:

using System;
using static System.Console;
class Program
{
    static void Main(string[] args)
    {
        var n = new DisposableObject();
        n.SayHello();
        //n.Dispose();
        WriteLine("Done!");
    }
}

class DisposableObject : IDisposable
{
    public void SayHello() => WriteLine("Hello!");

    ~DisposableObject() =>
        throw new InvalidOperationException($"{nameof(DisposableObject)}.{nameof(Dispose)}() not called.");
    
    public void Dispose()
    {
        GC.SuppressFinalize(this);
        WriteLine("Dispose was called.");
    }
}

Aqui, o destrutor irá lançar uma exception sempre que evocado. O destrutor, por padrão, é chamado pelo Garbage Collector no momento que o objeto está sendo retirado da memória. O que fizemos é desativar essa chamada quando o método Dispose é acionado. Dessa forma, a exceção será lançada apenas se o método Dispose não for chamado.

Compartilhe este insight:

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Are you interested to know more about the internals of the .NET Runtime? So you should spend some time reading...
Minha opção para “vender” os meus serviços, bem como os da EximiaCo, sempre foi buscar o reconhecimento, no lugar do...
Tive o prazer de trocar ideias com o pessoal do #CanalDotNET sobre NoSQL, sobretudo RavenDB. Aqui, compartilho o registro em...
O desenvolvimento de uma aplicação com ótima performance só é possível mediante considerações desde sua arquitetura. Otimizações pontuais de código,...
Como consultor, tenho a oportunidade de ajudar desenvolvedores, arquitetos e executivos a desenvolver soluções em TI que atendam os objetivos...
Empresas modernas, com estilo de gestão diferente e resultados espetaculares, estão desafiando tudo o que sabemos sobre estratégia e execução....