# Por que cada membro Dispose existe?

Caloni, 2025-11-14 dotnet <blogging [up] [copy]

Tudo gira em torno da necessidade de gerenciar objetos não gerenciáveis, o que implica em um finalizer para que seja feito isso, e apenas isso. O finalizer não deve tocar em código gerenciado, e é por isso que existe um Boolean definindo se disposing será feito. Todo o resto do código do finalizer deve ser para liberação de recursos nativos.

O Dispose sem parâmetros é público e existe para ser chamado pelo usuário, direta ou indiretamente (using). Ele deve chamar o Dispose protegido passando o parâmetro disposing como true. Deve avisar o GC para não chamar o finalizer, já que não devemos chamar o Dispose protegido de novo. Isso deve ser feito mesmo que não exista um finalizer na classe, pois as classes base podem conter, agora ou no futuro. A Microsoft também recomenda porque pode ser que no futuro a própria classe tenha, o que parece tão gambiarrento quanto você imagina. Se ainda não te convenci, a Microsoft obriga por contrato (documentado) que você deve sempre desabilitar.

If your type implements IDisposable, Dispose() should always call GC.SuppressFinalize(this) even if the class has no finalizer.

No entanto, se a classe não tem recursos não gerenciados e está selada, ou seja, não haverá subclasse com finalizer, você pode adotar um pattern mais simples, sem Dispose(disposing), sem finalizer e portanto sem chamar GC.SupressFinalizer. E se sua classe não tem nenhum recurso disposable você ainda pode apenas implementar o Dispose público vazio.

Para evitar gerenciar recursos nativos você pode usar a classe SafeHandle, que como já lida com o finalizer internamente evita a necessidade da classe que usa chamar a supressão.

O Dispose protegido faz a deslocação de recursos de fato, gerenciado, se disposing for true, e não gerenciado sempre. Para os gerenciados ele chama o método Dispose. Por fim, se houver um finalizer, ele chama o Dispose protegido com disposing como false, pois os objetos gerenciados podem já ter sido finalizados e resta os não gerenciados.


[2025-10] [index]