Compartir a través de


Referencias débiles

El recolector de elementos no utilizados no puede recopilar un objeto en uso por parte de una aplicación mientras el código de la aplicación puede llegar a ese objeto. Se dice que la aplicación tiene una referencia fuerte al objeto .

Una referencia débil permite que el recolector de elementos no utilizados recopile el objeto al tiempo que permite que la aplicación acceda al objeto. Una referencia débil solo es válida durante la cantidad de tiempo indeterminada hasta que el objeto se recopila cuando no existen referencias seguras. 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. Sin embargo, siempre existe el riesgo de que el colector de basura llegue primero al objeto antes de restablecer una referencia fuerte.

Las referencias débiles son útiles para los objetos que usan mucha memoria, pero se pueden volver a crear fácilmente si son recuperados por la recolección de basura.

Supongamos que una vista de árbol en una aplicación de Windows Forms muestra una elección jerárquica compleja de opciones para el usuario. Si los datos subyacentes son grandes, mantener el árbol en la memoria es ineficaz cuando el usuario participa en otra cosa de la aplicación.

Cuando el usuario cambia a otra parte de la aplicación, puede usar la WeakReference clase para crear una referencia débil al árbol y destruir todas las referencias fuertes. Cuando el usuario vuelve al árbol, la aplicación intenta obtener una referencia fuerte al árbol y, si tiene éxito, evita reconstruir el árbol.

Para establecer una referencia débil con un objeto , cree un WeakReference mediante la instancia del objeto al que se va a realizar el seguimiento. Para obtener un ejemplo de código, vea WeakReference en la biblioteca de clases.

Referencias débiles cortas y largas

Puede crear una referencia débil corta o una referencia débil larga:

  • Corto

    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. La referencia débil es por sí misma un objeto administrado y está sujeta a la recolección de basura igual que cualquier otro objeto administrado. Una referencia débil breve es el constructor sin parámetros para WeakReference.

  • long

    Una referencia débil larga se conserva después de que se llame al método Finalize del objeto. Esto permite volver a crear el objeto, pero el estado del objeto sigue siendo impredecible. Para usar una referencia larga, especifique true en el WeakReference constructor .

    Si el tipo del objeto no tiene un Finalize método, se aplica la funcionalidad de referencia débil corta y la referencia débil solo es válida hasta que se recopila el destino, lo que puede ocurrir en cualquier momento después de que se ejecute el finalizador.

Para establecer una referencia segura y usar el objeto de nuevo, convierta la propiedad Target de WeakReference en el tipo del objeto. Si la Target propiedad devuelve null, el objeto se recopiló; de lo contrario, puede seguir usando el objeto porque la aplicación ha recuperado una referencia fuerte a él.

Directrices para usar referencias débiles

Use referencias débiles largas solo cuando sea necesario, ya que el estado del objeto es impredecible después de la finalización.

Evite usar referencias débiles a objetos pequeños porque el propio puntero puede ser igual de grande o más grande.

Evite usar referencias débiles como una solución automática a problemas de administración de memoria. En su lugar, desarrolle una directiva de almacenamiento en caché eficaz para controlar los objetos de la aplicación.

Consulte también