2011-05-30 13 views
5

Estoy experimentando con WeakReference y estoy escribiendo un código que comprueba si una referencia débil es válida antes de devolver una referencia fuerte al objeto.Recopilador de basura al analizar referencias débiles

if (weakRef.IsValid) 
    return (ReferencedType)weakRef.Target; 
else 
    // Build a new object 

¿Cómo debo evitar que el GC recoja el objeto entre las llamadas "IsValid" y "Target"?

Respuesta

7

su lugar, debe hacer algo como esto:

var rt = weakRef.Target as ReferencedType; 

if (rt != null) 
    // You now have a strong reference that you can safely use 

Si usted tiene éxito en la obtención de una fuerte referencia a continuación, usted puede estar seguro de que no será recogido por el GC. Un ejemplo más completo se proporciona en la página de MSDN WeakReference y si no lo ha leído ya que también puede ser útil la siguiente:

Weak References

+0

+1 supongo que realmente es la forma correcta de hacerlo. –

+0

Esto me parece la forma más "natural" de ir. Para completar, requiere el uso de referencias cortas débiles, que en mi caso no es un problema. –

+0

+1 porque es la única forma de estar seguro. Pero no creo que deba transmitirlo al 'ReferenceType' necesario. También puede obtenerlo como 'objeto' y hacer la verificación de validez nula en esto. Dependiendo de lo que le guste hacer con el objeto siguiente, quizás tenga sentido, pero no es necesario para asegurarse de que la instancia esté activa. – Oliver

Cuestiones relacionadas