Condividi tramite


Riferimenti deboli

Il Garbage Collector non può raccogliere un oggetto in uso da un'applicazione mentre il codice dell'applicazione può raggiungere tale oggetto. Si dice che l'applicazione abbia un forte riferimento all'oggetto.

Un riferimento debole consente al Garbage Collector di raccogliere l'oggetto, consentendo comunque all'applicazione di accedere all'oggetto. Un riferimento debole è valido solo durante l'intervallo di tempo indeterminato fino a quando l'oggetto non viene raccolto quando non esistono riferimenti sicuri. Quando si usa un riferimento debole, l'applicazione può comunque ottenere un riferimento sicuro all'oggetto, impedendo che venga raccolto. Tuttavia, c'è sempre il rischio che il Garbage Collector arriverà all'oggetto prima che venga ristabilito un riferimento sicuro.

I riferimenti deboli sono utili per gli oggetti che usano molta memoria, ma possono essere ricreati facilmente se vengono recuperati dalla raccolta dei rifiuti.

Si supponga che una visualizzazione albero in un'applicazione Windows Form visualizzi una scelta gerarchica complessa di opzioni per l'utente. Se i dati sottostanti sono di grandi dimensioni, mantenere l'albero in memoria è inefficiente quando l'utente è coinvolto in un altro elemento nell'applicazione.

Quando l'utente passa a un'altra parte dell'applicazione, è possibile usare la WeakReference classe per creare un riferimento debole all'albero e distruggere tutti i riferimenti sicuri. Quando l'utente torna all'albero, l'applicazione tenta di ottenere un riferimento sicuro all'albero e, se ha esito positivo, evita di ricostruire l'albero.

Per stabilire un riferimento debole con un oggetto, creare un WeakReference utilizzando l'istanza dell'oggetto da monitorare. Per un esempio di codice, vedere WeakReference nella libreria di classi.

Riferimenti deboli brevi e lunghi

È possibile creare un riferimento debole breve o un riferimento debole lungo:

  • Breve

    La destinazione di un riferimento debole breve diventa null quando l'oggetto viene recuperato da Garbage Collection. Il riferimento debole è un oggetto gestito ed è soggetto alla raccolta dei rifiuti, esattamente come qualsiasi altro oggetto gestito. Un riferimento debole breve è il costruttore senza parametri per WeakReference.

  • Lungo

    Un lungo riferimento debole è mantenuto dopo la chiamata del metodo dell'oggetto Finalize. Ciò consente di ricreare l'oggetto, ma lo stato dell'oggetto rimane imprevedibile. Per usare un riferimento lungo, specificare true nel WeakReference costruttore .

    Se il tipo dell'oggetto non dispone di un metodo Finalize, si applica la funzionalità di riferimento debole breve e il riferimento debole è valido solo fino a quando il target viene raccolto, il che può avvenire in qualsiasi momento dopo l'esecuzione del finalizzatore.

Per stabilire un riferimento sicuro e usare di nuovo l'oggetto, eseguire il cast della Target proprietà di un WeakReference al tipo dell'oggetto. Se la Target proprietà restituisce null, l'oggetto è stato raccolto; in caso contrario, è possibile continuare a utilizzare l'oggetto perché l'applicazione ha recuperato un riferimento sicuro.

Linee guida per l'uso di riferimenti deboli

Utilizzare riferimenti deboli lunghi solo quando necessario, in quanto lo stato dell'oggetto è imprevedibile dopo la finalizzazione.

Evitare di usare riferimenti deboli a oggetti di piccole dimensioni perché il puntatore stesso può essere grande o maggiore.

Evitare di usare riferimenti deboli come soluzione automatica ai problemi di gestione della memoria. Sviluppare invece criteri di memorizzazione nella cache efficaci per la gestione degli oggetti dell'applicazione.

Vedere anche