O principal uso da interface IDisposable é quando queremos liberar recursos não gerenciados. O Garbage Collector (Coletor de Lixo) automaticamente libera a memória alocada para um objeto gerenciado quando este objeto não está mais em uso. No entanto, não há como prever quando o Garbage Collector irá realizar a coleta do lixo. Além disso, o Garbage Collector não tem conhecimento de recursos não gerenciados, como identificadores de janela, ou abrir arquivos e fluxos.
Com o uso do método Dispose() da interface IDisposable, podemos explicitamente liberar os recursos não gerenciados em conjunto com o Garbage Collector.
using System;
using System.IO;
//Implementação da interface IDisposable
public class MyReader : IDisposable
{
//Um StreamReader, que apesar de trabalhar com
//recursos nao gerenciados, é um objeto do
//.Net framework e já tem implementada a interface
//IDisposable e é tratado como um objeto gerenciado
StreamReader reader;
bool disposed = false;
//Inicializa o reader
public MyReader(string file)
{
reader = new StreamReader(file);
}
//Utiliza recursos do reader normalmente
public string ReadToEnd()
{
return reader.ReadToEnd();
}
//Finalizador:
//Este metodo é o finalizador, que é invocado pelo GC
//para liberar os recursos.
//Todo a liberacao implementada dentro dele só será
//executada quando o metodo for invocado, porém não
//conseguimos saber quando isto vai acontecer e recursos
//importantes podem ficar presos até que isto aconteça.
~MyReader()
{
Dispose(false);
}
//Quando o Dispose é acionado, os recursos gerenciados e
//não gerenciados são liberados e ainda avisamos o GC
//para nao acionar o finalizador pois ele já não é mais necessário
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
//Caso o objeto ainda não tenha sido destruído
//libera-se os recursos
if (!this.disposed)
{
//Se o objeto estiver sendo destruído através do metodo
//Dispose libera-se os recurso gerenciados
if (disposing)
{
//Libera recursos gerenciados
reader.Dispose();
}
//Sempre libera-se os recursos não gerenciados, como utilizacao de ponteiros
//em chamadas a API do Windows e já assume-se que os recursos foram liberados
disposed = true;
}
}
}