Riferimenti deboliWeak References

Il Garbage Collector non può raccogliere un oggetto usato da un'applicazione finché il codice dell'applicazione è in grado raggiungere tale oggetto.The garbage collector cannot collect an object in use by an application while the application's code can reach that object. Si dice che l'applicazione ha un riferimento sicuro all'oggetto.The application is said to have a strong reference to the object.

Un riferimento debole consente al Garbage Collector di raccogliere l'oggetto, pur senza impedire all'applicazione di accedervi.A weak reference permits the garbage collector to collect the object while still allowing the application to access the object. Un riferimento debole è valido solo durante il periodo di tempo indeterminato fino a quando l'oggetto viene raccolto, se non è presente nessun riferimento sicuro.A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist. Quando si usa un riferimento debole, l'applicazione può comunque ottenere un riferimento sicuro all'oggetto, che ne impedirà la raccolta.When you use a weak reference, the application can still obtain a strong reference to the object, which prevents it from being collected. Tuttavia esiste sempre il rischio che il Garbage Collector raggiunga l'oggetto prima che venga ristabilito un riferimento sicuro.However, there is always the risk that the garbage collector will get to the object first before a strong reference is reestablished.

I riferimenti deboli sono utili per gli oggetti che usano grandi quantità di memoria ma possono essere ricreati facilmente se vengono raccolti dall'operazione di Garbage Collection.Weak references are useful for objects that use a lot of memory, but can be recreated easily if they are reclaimed by garbage collection.

Si supponga che una visualizzazione struttura ad albero in un'applicazione Windows Forms mostri una gamma gerarchica complessa di opzioni all'utente.Suppose a tree view in a Windows Forms application displays a complex hierarchical choice of options to the user. Se i dati sottostanti sono di grandi dimensioni, non è efficiente mantenere la struttura in memoria mentre l'utente esegue altre operazioni nell'applicazione.If the underlying data is large, keeping the tree in memory is inefficient when the user is involved with something else in the application.

Quando l'utente passa a un'altra parte dell'applicazione, è possibile usare la classe WeakReference per creare un riferimento debole all'albero ed eliminare tutti i riferimenti sicuri.When the user switches away to another part of the application, you can use the WeakReference class to create a weak reference to the tree and destroy all strong references. Quando l'utente torna alla struttura, l'applicazione cerca di ottenere un riferimento sicuro alla struttura ad albero e, se vi riesce, evita la ricostruzione della struttura.When the user switches back to the tree, the application attempts to obtain a strong reference to the tree and, if successful, avoids reconstructing the tree.

Per stabilire un riferimento debole a un oggetto è necessario creare una classe WeakReference usando l'istanza dell'oggetto di cui tenere traccia.To establish a weak reference with an object, you create a WeakReference using the instance of the object to be tracked. È quindi necessario impostare la proprietà Target su questo oggetto e impostare il riferimento originale all'oggetto su null.You then set the Target property to that object and set the original reference to the object to null. Per un esempio di codice, vedere WeakReference nella libreria di classi.For a code example, see WeakReference in the class library.

Riferimenti deboli brevi e lunghiShort and Long Weak References

È possibile creare un riferimento debole breve o lungo:You can create a short weak reference or a long weak reference:

  • ShortShort

    La destinazione di un riferimento debole breve diventa null quando l'oggetto viene raccolto dall'operazione di Garbage Collection.The target of a short weak reference becomes null when the object is reclaimed by garbage collection. Il riferimento debole è in sé un oggetto gestito ed è soggetto a Garbage Collection come qualsiasi altro oggetto gestito.The weak reference is itself a managed object, and is subject to garbage collection just like any other managed object. Un riferimento debole breve è il costruttore senza parametri per WeakReference.A short weak reference is the parameterless constructor for WeakReference.

  • LongLong

    Un riferimento debole lungo viene mantenuto dopo la chiamata al metodo Finalize dell'oggetto.A long weak reference is retained after the object's Finalize method has been called. Ciò consente che l'oggetto venga ricreato, ma lo stato dell'oggetto non è prevedibile.This allows the object to be recreated, but the state of the object remains unpredictable. Per usare un riferimento lungo, specificare true nel costruttore WeakReference.To use a long reference, specify true in the WeakReference constructor.

    Se il tipo dell'oggetto non dispone di un metodo Finalize, viene applicata la funzionalità del riferimento debole breve e il riferimento debole è valido solo fino alla raccolta del target, che può verificarsi in qualsiasi momento dopo l'esecuzione del finalizzatore.If the object's type does not have a Finalize method, the short weak reference functionality applies and the weak reference is valid only until the target is collected, which can occur anytime after the finalizer is run.

Per stabilire un riferimento sicuro e usare nuovamente l'oggetto, eseguire il cast della proprietà Target di un WeakReference al tipo dell'oggetto.To establish a strong reference and use the object again, cast the Target property of a WeakReference to the type of the object. Se la proprietà Target restituisce null l'oggetto è stato raccolto. In caso contrario è possibile continuare a usare l'oggetto, perché l'applicazione ha recuperato un riferimento sicuro all'oggetto stesso.If the Target property returns null, the object was collected; otherwise, you can continue to use the object because the application has regained a strong reference to it.

Linee guida per l'uso dei riferimenti deboliGuidelines for Using Weak References

Usare i riferimenti deboli lunghi solo in caso di necessità, perché dopo la finalizzazione lo stato dell'oggetto è imprevedibile.Use long weak references only when necessary as the state of the object is unpredictable after finalization.

Evitare di usare riferimenti deboli a oggetti di piccole dimensioni, poiché il puntatore può avere dimensioni equivalenti o superiori.Avoid using weak references to small objects because the pointer itself may be as large or larger.

Evitare di usare i riferimenti deboli come soluzione automatica per i problemi di gestione della memoria.Avoid using weak references as an automatic solution to memory management problems. In alternativa, sviluppare un criterio di memorizzazione nella cache efficiente per gestire gli oggetti dell'applicazione.Instead, develop an effective caching policy for handling your application's objects.

Vedere ancheSee also