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:

5 respostas

  1. O processo de liberação de recursos pode ser oneroso e, durante a coleta, vai prejudicar a performance geral da aplicação.

    O melhor é optar sempre por liberação explícita.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

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:

O comportamento que descrevo nesse post é extremamente nocivo a carreira de todo técnico. Geralmente resulta em desgaste desnecessário e...
Nessa semana, em uma dessas conversas que valem a pena, surgiu uma breve discussão sobre um texto antigo de Rubem...
C++ é uma linguagem de programação velha, charmosa para os iniciados, assustadora para aqueles que conhecem pouco dela. Bjarne Stroustrup desenvolveu...
When designing systems that need to scale you always need to remember that using better resources could help you to...
Last year, Mario Fusco wrote a blog post series questioning the way Java developers are implementing the Gang of Four (GoF) patterns....
Pimenta nos olhos dos outros é refresco. Quando não é pela satisfação sádica proporcionada pela dor alheia é pelo alívio...
× Precisa de ajuda?