Trilhas
/
C#
C#
/
Programa
/
Limpeza de recursos
Li

Limpeza de recursos em C#

2 exercícios

Sobre Limpeza de recursos

A interface IDisposable é central para a limpeza de recursos e tem dois papéis importantes em C#:

  • Ela indica a quem usa a classe que a implementa que essa pessoa é responsável por avisar à classe (chamando o método Dispose()) que ela não é mais necessária, para que ela possa liberar quaisquer recursos não gerenciados ou redefinir seu estado interno conforme apropriado. Isso contrasta com a abordagem normal de limpeza, em que o coletor de lixo cuida de tudo (principalmente, liberar memória).
  • Junto com o compilador e o runtime, a interface IDisposable dá suporte à instrução using, discutida no exercício resource-lifetime.

É possível, mas pouco provável, que Dispose() seja chamado pela interface em algum tipo de rotina genérica de limpeza.

IDisposable aparece com mais frequência em classes de biblioteca que encapsulam recursos (não gerenciados) do sistema operacional, como System.IO.Stream e System.IO.TextReader. (Os Streams e os TextReaders são abordados em outros exercícios).

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

Se uma classe que você está usando implementa a interface IDispoable, você precisa garantir que Dispose() seja chamado (com o uso de cláusulas catch e finally) quando a instância não for mais necessária. Se uma classe tem um membro que implementa IDisposable, ela provavelmente também precisa implementar IDisposable, para que Dispose() possa ser chamado e libere 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 gerenciados envolvidos. Digamos que você tenha um objeto de vida longa que exige que objetos de vida curta se registrem nele e cancelem o registro quando não forem mais necessários. Implementar IDisposable no objeto de vida curta deixa claro para quem usa essa classe que Dispose() precisa ser chamado no fim da vida do objeto de vida curta.

Padrão dispose

Você vai 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 liberação de recursos nas classes base seja tratada corretamente. O padrão dispose é abordado em um exercício mais adiante.

O padrão dispose está relacionado principalmente a recursos não gerenciados. Se você usa o mecanismo P/Invoke e métodos extern, precisa entender como e quando implementar o padrão dispose. A maioria das pessoas que desenvolve em C# raramente precisa lidar diretamente com recursos não gerenciados dessa forma.

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Limpeza de recursos

A prática está bloqueada

Desbloqueie mais 1 exercício para praticar Limpeza de recursos