A interface IDisposable é fundamental para a limpeza de recursos e tem dois papéis importantes em C#:
Dispose()) de que já não é necessária, para que esta possa libertar eventuais recursos não geridos ou repor o seu estado interno conforme for adequado. Isto contrasta com a abordagem normal de limpeza, que consiste em deixar o coletor de lixo tratar de tudo (principalmente, libertar memória).IDisposable suporta a instrução using, abordada no exercício resource-lifetime.É possível, embora pouco provável, que Dispose() seja chamado através da interface em alguma rotina genérica de limpeza.
O IDisposable aparece mais frequentemente em classes de bibliotecas que envolvem recursos do sistema operativo (não geridos), como System.IO.Stream e System.IO.TextReader. (Os Streams e os TextReaders são abordados noutros exercícios).
public class TextHandler : IDispoable
{
private TextReader reader = new TextReader(...);
public void Dispose()
{
reader.Dispose();
}
}
Se uma classe que estás a usar implementa a interface IDisposable, tens de garantir que Dispose() é chamado (recorrendo a cláusulas catch e finally) quando a instância já não é necessária. Se uma classe tiver um membro que implementa IDisposable, é bem possível que tenha de implementar IDisposable ela própria, para que Dispose() possa ser chamado e libertar o membro que implementa IDisposble.
public class Activity : IDisposable
{
private MyResource myResource;
public Activity()
{
myResource = new MyResource();
}
public void Perform()
{
try
{
myResource.BeUseful();
}
catch (Exception)
{
myResource.Dispose();
}
}
public void Dispose()
{
myResource.Dispose();
}
}
A interface IDisposable pode ser útil mesmo quando não há recursos não geridos envolvidos. Imagina que tens um objeto de longa duração que exige que objetos de curta duração se registem nele e depois anulem o registo quando já não são necessários. Implementar IDispoable no objeto de curta duração avisa quem usa essa classe de que Dispose() tem de ser chamado no fim da vida do objeto de curta duração.
Vais encontrar referências na documentação ao padrão Dispose. O padrão Dispose inclui chamar Dispose() a partir do finalizador de uma classe e garantir que a libertação de recursos nas classes base é tratada corretamente. O padrão Dispose é abordado num exercício posterior.
O padrão Dispose está sobretudo relacionado com recursos não geridos. Se usares o mecanismo P/Invoke e métodos extern, tens de perceber como e quando implementar o padrão Dispose. A maioria dos programadores de C# raramente tem de lidar diretamente com recursos não geridos desta forma.