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 recursos externos de manipulação de arquivos.
Com o uso do método Dispose() da interface IDisposable, podemos explicitamente liberar os recursos não gerenciados em conjunto com o Garbage Collector.

Exemplo de Uso


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.
    //Toda a liberação implementada dentro dele só será
    //executada quando o método 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 utilização de ponteiros
            //em chamadas a API do Windows e já assume-se que os recursos foram liberados
            disposed = true;
        }
    }
}