Pergunta

GC é para objetos gerenciados e Finalize é para objetos não gerenciados, é isso que tenho lido.Dispose está implícito e Finalize é Explícito é o que tenho lido.Alguém pode me dar um exemplo de módulo em que todas as três coisas foram usadas por motivos diferentes?

Foi útil?

Solução

GC é coleta de lixo. É o gerenciamento automático de memória, que lida com a limpeza de objetos alocados na pilha gerenciada. O .NET GC emprega uma marca e algoritmo de varredura. Quando uma coleta de lixo ocorre, basicamente considera todo o objeto na parte da pilha a ser limpa como recuperável. Em seguida, passa por um processo de marcação em que digitaliza as raízes. Ou seja, identifica objetos que ainda estão em uso pelo aplicativo. Tendo feito isso, os objetos restantes são elegíveis para limpeza. A pilha pode ser compactada como parte da limpeza.

Métodos de descarte e finalizador oferecem uma opção para os recursos de limpeza, que são não tratado por gc. Por exemplo, isso pode ser alças nativas e coisas do gênero. Eles não têm nada a ver com a memória de recuperação na pilha gerenciada.

Descartar deve ser chamado explicitamente em um tipo que implementa IDisposable. Pode ser chamado através do Dispose() próprio método ou através do using construir. O GC não ligará para dispitar automaticamente.

Um finalizador ou destruidor (como a especificação do idioma chama), por outro lado, será chamada automaticamente às vezes Depois que o objeto foi elegível para a limpeza. Os métodos finalizados são executados sequencialmente em um thread dedicado.

Dispose() Permite a limpeza determinística dos recursos, enquanto um finalizador pode atuar como uma rede de segurança, caso o usuário não ligue Dispose().

Se um tipo implementar um finalizador, a limpeza das instâncias será adiada, pois o finalizador deve ser chamado antes da limpeza. Ou seja, exigirá uma coleta adicional para recuperar a memória para instâncias do tipo. Se o tipo também implementar idispossáveis, o método de descarte poderá ser chamado e a instância poderá se remover da finalização. Isso permitirá que o objeto seja limpo como se não tivesse um finalizador.

Se você quiser cavar nisso, eu recomendo CLR via C# de Jeffrey Richter. É um ótimo livro e abrange todos os detalhes sangrentos disso (deixei de fora uma série de detalhes). A nova terceira edição foi lançada.

Outras dicas

Um dos benefícios do .NET é o coletor de lixo.Em muitas linguagens, cada pedaço de memória deve ser gerenciado pelo desenvolvedor – qualquer memória alocada deve eventualmente ser liberada.No .NET (C#), o Garbage Collector (GC) cuidará do processo de liberação de memória para você.Ele rastreia o uso de seus objetos e depois que eles se tornam "desenraizados" (ou seja:não houver referências em seu aplicativo a esse objeto, direta ou indiretamente), a memória do objeto será limpa automaticamente.

Descarte, ou mais particularmente, IDisposable e o padrão Dispose, é usado para manipular recursos separadamente do GC.Alguns recursos precisam ser limpo explicitamente, por várias razões.Isso inclui o uso de uma API "nativa" (onde o .NET não conhece a memória alocada), o uso de um recurso que agrupa identificadores nativos, etc.Para lidar com isso de forma limpa, você implementa IDisposable e o padrão Dispose.

A finalização ocorre em objetos quando eles estão prestes a serem coletados pelo coletor de lixo.Isso fornece uma "rede de segurança" onde um objeto que deveria ter sido descartado ainda pode ser limpo, mesmo que um pouco mais tarde do que o ideal.Ao implementar um finalizador, você pode garantir que os recursos não gerenciados sejam sempre liberados.

O problema com a maioria dos exemplos é que existem vários motivos para usar IDisposable, e a implementação adequada difere dependendo do motivo pelo qual você o está usando.Por exemplo, se você agrupar um recurso nativo diretamente, deverá implementar um finalizador, mas se encapsular outro tipo IDisposable, um finalizador não será necessário, mesmo que você ainda deva implementar IDisposable.Para resolver isso, escrevi sobre IDisposable e finalização em profundidade no meu blog, descrevendo os vários motivos pelos quais você usaria IDisposable e diferentes padrões por diferentes motivos.

Você pode apenas querer ler o que eu considero o artigo definitivo sobre idipostáveis, finalizadores e coleta de lixo, Shawn Farkas ' Clr de dentro para fora: cavando em idispossáveis.

Este artigo deixa muito pouca dúvida sobre o assunto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top