Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
nullquando 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
truenel 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.