IDisposable
Numa aplicação
em C/C++ tradicional o gerenciamento dos objetos na memória é feito pelo
programador. Isto causa uma série de prejuízos por falhas humanas e grande
perda na produtividade. O C# é uma linguagem que tira este trabalho do
programador através do Garbage Collector do.NET.
O Garbage Collector consegue perceber objetos que não estão mais em
uso e os limpa automáticamente. A limpeza da GC não pode ser provista pelo
programador, e desta forma os objetos podem ficar por tempo indesejado na
memória. Para resolver esta questão o uso da interface IDisposable é
recomendável.
A Interface
IDisposable possui apenas um método chamado void Dispose(). Este método possui
instruções que limpam o objeto em questão da memória.
Os objetos que
não são mais úteis em tempo de execução e que podem ser percebidos pelo
programador devem ser dispostos, com uma chamada ao método Dispose() contido
nele.
Em
.NET as classes podem ter destrutores. São métodos que são chamados
automaticamente quando um objeto é destruído. Os destrutores não podem ser
chamados diretamente numa aplicação. Existem 2 formas diferentes de se dispor
objetos em .NET: disposição de recursos gerenciados e disposição de recursos
não gerenciados.
Disposição de recursos gerenciados
Os recursos
gerenciados são aqueles já possuem método de disposição próprio. Quando um
objeto é disposto, os seus atributos gerenciados também devem ser dispostos.
Numa classe que só tenha, por exemplo, um StreamReader. O Dispose deve fazer
uma chamada ao método StreamReader.Dispose(). Este mesmo conceito vale para
todos os objetos contidos na classe a ser disposta.
Disposição de recursos não gerenciados
Nem todos os
objetos contidos numa classe são gerenciados e nem ela mesma. Desta forma, deve-se aplicar outros conceitos a classe para sua
disposição. Um método privado void
dispose(bool) deve existir para auxiliar
nesta tarefa. Além disto, deve também existir um método externo chamado bool
CloseHandle(IntPtr).
Veja um Exemplo
public
class MeuRecurso
: IDisposable
{
// Nunca
deixe este método ser virtual.
// As classes
que herdarem desta devem utilizar este método para Dispose
public void Dispose()
{
GC.SuppressFinalize(this);
}
}
Nenhum comentário:
Postar um comentário