using
System;
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
MyReader(
string
file)
reader =
new
StreamReader(file);
}
//Utiliza recursos do reader normalmente
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(
);
//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
void
Dispose()
true
GC.SuppressFinalize(
this
private
disposing)
//Caso o objeto ainda não tenha sido destruído
//libera-se os recursos
if
(!
.disposed)
//Se o objeto estiver sendo destruído através do metodo
//Dispose libera-se os recurso gerenciados
(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