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:

A publicação original desse post ocorreu em meu blog, em 2011, e gerou uma bela discussão. Infelizmente, essa publicação não...
Desenvolver software profissionalmente, em um ambiente onde a finalidade é lucro, implica em ampliar ganhos e/ou reduzir custos. O resultado...
So, I decided to learn how to code using R. That’s something I wrote: ## defining a function makeCacheMatrix <-...
Um de nossos objetivos, nesse momento, é  melhorar a comunicação, compartilhando a visão do nosso fluxo de trabalho com a...
Minha opção para “vender” os meus serviços, bem como os da EximiaCo, sempre foi buscar o reconhecimento, no lugar do...
Investimos consideravelmente no planejamento estratégico de nossas organizações. Entretanto, a execução não tem sido tarefa fácil. Em minha interpretação, boa...