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 alcançar esse objeto. Diz-se que o aplicativo tem uma referência forte 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 somente por uma quantidade indeterminada de tempo até que o objeto seja coletado, quando não houver 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 ao objeto primeiro antes que uma referência forte seja restabelecida.

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

Suponha que uma exibição de á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 será ineficiente quando o usuário estiver envolvido com outra coisa no aplicativo.

Quando o usuário alterna para outra parte do aplicativo, você pode usar a WeakReference classe para criar uma referência fraca à á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 obtiver êxito, evita reconstruir a árvore.

Para estabelecer uma referência fraca com um objeto, você cria 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 destino de uma referência fraca curta se torna 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 Finalize do 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 se aplicará e a referência fraca será válida somente 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 propriedade Target de um WeakReference para o tipo do objeto. Se a Target propriedade retornar null, o objeto foi coletado; caso contrário, você poderá continuar a usar o objeto porque o aplicativo recuperou uma referência forte a ele.

Diretrizes para usar referências fracas

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

Evite usar referências fracas para 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 aplicativo.

Consulte também