Compartilhar via


Referências fracas

O coletor de lixo não pode coletar um objeto em uso por um aplicativo enquanto o código do aplicativo pode acessar esse objeto. O aplicativo deve ter uma referência forte para o objeto.

Uma referência fraca permite que o coletor de lixo para coletar o objeto enquanto ainda permite que o aplicativo acessar o objeto. Uma referência fraca é válida apenas durante o período indeterminado até que o objeto é coletado quando não existirem nenhum referências fortes. Quando você usa uma referência fraca, o aplicativo ainda pode obter uma referência forte para o objeto, o que impede que ele seja coletado. No entanto, sempre há o risco de que o coletor de lixo terá para o objeto primeiro antes de uma referência forte é restabelecida.

Referências fracas são úteis para os objetos que usam muita memória, mas podem ser facilmente recriados se eles são recuperados pela coleta de lixo.

Suponha que um modo de exibição de árvore em um aplicativo Windows Forms exibe uma escolha hierárquica complexa de opções para o usuário. Se os dados subjacentes são grandes, mantendo a árvore na memória é ineficiente quando o usuário está envolvido com algo no aplicativo.

Quando o usuário alterna de fora para outra parte do aplicativo, você pode usar o WeakReference classe para criar uma referência fraca para a árvore e destruir todas as referências de alta segurança. Quando o usuário alterna de volta para a árvore, o aplicativo tenta obter uma referência forte para a árvore e, se for bem-sucedido, evita reconstruindo a árvore.

Para estabelecer uma referência fraca com um objeto, você cria um WeakReference usando a instância do objeto a ser rastreadas. Você então definir o Target propriedade ao objeto e definir o objeto para null. Para obter um exemplo de código, consulte WeakReference na biblioteca de classe.

Curto e longo fracas referências

Você pode criar uma referência fraca curta ou uma referência fraca longo:

  • Short

    O destino de uma referência fraca curto se torna null quando o objeto é recuperado por coleta de lixo. A referência fraca é um objeto gerenciado si mesmo e está sujeito a coleta de lixo, assim como qualquer objeto gerenciado. Uma referência fraca curta é o construtor padrão para WeakReference.

  • Long

    Uma referência fraca longo é mantida após o objeto Finalize método foi chamado. Isso permite que o objeto seja recriado, mas o estado do objeto permanece imprevisível. Para usar uma referência longa, especifique true na WeakReference construtor.

    Se o tipo de objeto não tiver um Finalize o método, a funcionalidade de curto referência fraca se aplica e a referência fraca é válida até que o destino é coletado, que pode ocorrer a qualquer momento após o finalizador é executar.

Para estabelecer uma referência forte e use o objeto novamente, converta o Target propriedade de um WeakReference o tipo de objeto. Se o Target retorna a propriedade null, o objeto foi coletado; Caso contrário, você pode continuar a usar o objeto porque o aplicativo tem recuperou uma forte referência a ele.

Diretrizes para usar referências fracas

Use referências muito fracas somente quando necessário, como o estado do objeto é imprevisível depois da finalização.

Evite usar referências fracas para pequenos objetos, pois o ponteiro em si pode ser tão grande ou maior.

Evite usar referências fracas como uma solução automática para problemas de gerenciamento de memória. Em vez disso, desenvolva uma política efetiva de cache para manipular os objetos do aplicativo.

Consulte também

Conceitos

Coleta de Lixo