Referencias parcialesWeak References

El recolector de elementos no utilizados no puede recopilar un objeto que está siendo usado por una aplicación mientras el código de aplicación pueda llegar a ese objeto.The garbage collector cannot collect an object in use by an application while the application's code can reach that object. En este caso, se dice que la aplicación tiene una referencia segura al objeto.The application is said to have a strong reference to the object.

Una referencia débil permite que el recolector de elementos no utilizados recopile el objeto mientras sigue permitiendo que la aplicación tenga acceso al objeto.A weak reference permits the garbage collector to collect the object while still allowing the application to access the object. Una referencia débil es válida solo durante un período indeterminado de tiempo, hasta que el objeto se recopila cuando no existe ninguna referencia segura.A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist. Cuando se usa una referencia débil, la aplicación todavía puede obtener una referencia segura al objeto, lo que evita que se recopile.When you use a weak reference, the application can still obtain a strong reference to the object, which prevents it from being collected. Pero, siempre existe el riesgo de que el recolector de elementos no utilizados llegue al objeto antes de que se restablezca una referencia segura.However, there is always the risk that the garbage collector will get to the object first before a strong reference is reestablished.

Las referencias débiles son útiles para objetos que usan mucha memoria, pero que pueden volverse a crear fácilmente si los reclama la recolección de elementos no utilizados.Weak references are useful for objects that use a lot of memory, but can be recreated easily if they are reclaimed by garbage collection.

Imagine una vista de árbol de una aplicación de Windows Forms que muestra una jerarquía compleja de opciones al usuario.Suppose a tree view in a Windows Forms application displays a complex hierarchical choice of options to the user. Si la cantidad de datos subyacentes es grande, mantener el árbol en memoria es ineficaz cuando el usuario está ocupado en otra parte de la aplicación.If the underlying data is large, keeping the tree in memory is inefficient when the user is involved with something else in the application.

Cuando el usuario cambia a otra parte de la aplicación, se puede usar la clase WeakReference para crear una referencia débil al árbol y destruir todas las referencias seguras.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. Cuando el usuario vuelve al árbol, la aplicación intenta obtener una referencia segura al árbol y, si la obtiene, evita tener que reconstruir el árbol.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.

Para establecer una referencia débil a un objeto, se crea un elemento WeakReference usando la instancia del objeto que se debe seguir.To establish a weak reference with an object, you create a WeakReference using the instance of the object to be tracked. Después, se establece la propiedad Target como ese objeto y se establece la referencia original al objeto como null.You then set the Target property to that object and set the original reference to the object to null. Para obtener un ejemplo de código, consulte WeakReference en la biblioteca de clases.For a code example, see WeakReference in the class library.

Referencias débiles cortas y largasShort and Long Weak References

Puede crear una referencia débil corta o una referencia débil larga:You can create a short weak reference or a long weak reference:

  • ShortShort

    El destino de una referencia débil corta se convierte en null cuando el objeto es reclamado por la recolección de elementos no utilizados.The target of a short weak reference becomes null when the object is reclaimed by garbage collection. La referencia débil es, en sí, un objeto administrado y está sujeta a la recolección de elementos no utilizados igual que cualquier otro objeto administrado.The weak reference is itself a managed object, and is subject to garbage collection just like any other managed object. Una referencia débil corta es el constructor predeterminado para WeakReference.A short weak reference is the default constructor for WeakReference.

  • LongLong

    Una referencia débil larga se conserva después de que se llame al método Finalize del objeto.A long weak reference is retained after the object's Finalize method has been called. Esto permite que el objeto se vuelva a crear, pero el estado del objeto sigue siendo imprevisible.This allows the object to be recreated, but the state of the object remains unpredictable. Para usar una referencia larga, especifique true en el constructor WeakReference.To use a long reference, specify true in the WeakReference constructor.

    Si el tipo de objeto no tiene un método Finalize, se aplica la funcionalidad de referencia débil corta y la referencia débil es válida solo hasta que se recopile el destino, lo que puede ocurrir en cualquier momento después de que se ejecute el finalizador.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.

Para establecer una referencia segura y usar el objeto de nuevo, convierta la propiedad Target de WeakReference en el tipo del objeto.To establish a strong reference and use the object again, cast the Target property of a WeakReference to the type of the object. Si la propiedad Target devuelve null, el objeto se ha recopilado; en caso contrario, aún puede usar el objeto, porque la aplicación ha obtenido una referencia segura a este.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.

Directrices para usar referencias débilesGuidelines for Using Weak References

Use referencias débiles largas solo cuando sea necesario, ya que el estado del objeto es imprevisible después de la finalización.Use long weak references only when necessary as the state of the object is unpredictable after finalization.

Evite usar referencias débiles a objetos pequeños porque el propio puntero puede ser igual de grande o mayor.Avoid using weak references to small objects because the pointer itself may be as large or larger.

Evite usar referencias débiles como solución automática para problemas de administración de memoria.Avoid using weak references as an automatic solution to memory management problems. En su lugar, desarrolle una directiva eficaz de almacenamiento en caché para controlar los objetos de la aplicación.Instead, develop an effective caching policy for handling your application's objects.

Vea tambiénSee also