C#: Using e Dispose

Não vejo muitos softwares usando em seu código, pelo menos da maneira correta, o bloco using em conjunto método Dispose da interface IDisposable() da maneira correta. Mas vou mostrar em um exemplo bem simples como estes dois recursos podem ser poderosos para manter uma aplicação enxuta e performática.

Para começar, vamos criar uma solução chamada UsingAndDispose e incluir dois projetos, um projeto de domínio do tipo Class Library chamado UsingAndDispose.Domain e outro do tipo Console Application chamado UsingAndDispose.Prompt.

No projeto de domínio, vamos incluir uma classe chamada TxtFile, que recebe dois parâmetros via construtor, nome do arquivo e pasta, e com eles alimenta uma propriedade que retorna o caminho completo. Incluiremos também um método que efetuará o fechamento do arquivo após a leitura e limpará a memória, mas neste caso vamos apenas escrever um frase na tela do console.

Crie uma classe chamada TxtFile e defina uma herança da interface IDisposable, que exigirá a implementação do método Dispose, que chamará o método Close().

Obs.: Não vamos entrar na complexidade da lógica de leitura de um arquivo de texto de fato, mas apenas criar um classe que poderia implementá-la, o importante é entender o mecanismo do bloco using.

Então, no projeto de console, altere a classe Program.cs, incluindo um bloco using, conforme o código a seguir, e faça uma referência ao projeto de domínio para acessar a classe TxtFile.

Ao executar o código acima, percebemos que a mensagem do método Close é exibida em tela, mas o curioso que em nenhum momento o chamamos diretamente. Isso acontece porque a classe TxtFile implementa a interface IDisposable, e quando o using recebe objetos que são implementados a partir desta interface, automaticamente é chamado o método Dispose() ao fechar o bloco. E neste caso, o método Dispose() foi implementado com uma chamada ao método Close().

Acesse o projeto completo no meu GitHub:

https://github.com/tiagopariz/UsingAndDispose

 

 

Deixe uma resposta

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