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 alcançar esse objeto. Diz-se que o pedido tem uma forte referência ao objeto.

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

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

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

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

Para estabelecer uma referência fraca com um objeto, crie um WeakReference usando a instância do objeto a ser rastreado. Para obter um exemplo de código, consulte WeakReference na biblioteca de classes.

Referências Fracas Curtas e Longas

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

  • Curto

    O alvo de uma referência fraca curta torna-se null quando o objeto é recuperado pela coleta de lixo. A referência fraca é em si um objeto gerenciado e está sujeita à coleta de lixo como qualquer outro objeto gerenciado. Uma referência fraca curta é o construtor sem parâmetros para WeakReference.

  • Longo

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

    Se o tipo do objeto não tiver um Finalize método, a funcionalidade de referência fraca curta será aplicada e a referência fraca será válida apenas até que o destino seja coletado, o que pode ocorrer a qualquer momento após a execução do finalizador.

Para estabelecer uma referência forte e usar o objeto novamente, converta a Target propriedade de a WeakReference para o tipo do objeto. Se a Target propriedade retornar null, o objeto foi coletado, caso contrário, você pode continuar a usar o objeto porque o aplicativo recuperou uma referência forte a ele.

Diretrizes para o uso de referências fracas

Use referências longas e fracas apenas quando necessário, pois o estado do objeto é imprevisível após a finalização.

Evite usar referências fracas a objetos pequenos porque 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 de cache eficaz para lidar com os objetos do seu aplicativo.

Consulte também