2011-10-26 19 views
12

Supongamos que tengo 2 clases, Foo y Bar. Foo no tiene (y no puede tener) una relación con Bar.C#: Crear una referencia fuerte entre los objetos, sin que uno haga referencia al otro

Sin embargo, quiero que una instancia de barra permanezca activa, siempre y cuando su instancia foo permanezca activa. ¿Hay alguna forma de hacerlo, sin que realmente se haga referencia a la barra?

Gracias, Koen

+2

Cuando intenta cambiar la forma en que funciona el recolector de basura, probablemente debería examinar su diseño y ver si se puede cambiar para que funcione dentro del idioma. Dicho eso: ¡pregunta interesante! =) – Jens

+0

¿Por qué hacer la vida difícil para ti al rechazar la solución trivial? –

+0

@DavidHeffernan Parece que tienen algún tipo de problema de dependencia que les impide hacerlo. – Steve

Respuesta

16

Eche un vistazo a la ConditionalWeakTable Class.

Permite a los compiladores asociar dinámicamente campos de objeto a objetos gestionados.

Es esencialmente un diccionario donde tanto la clave como el valor son una WeakReference, y el valor se mantiene activo mientras la clave esté activa.

Por ejemplo, se puede definir un

ConditionalWeakTable<Foo, Bar> table 

y añadir un par/foo bar. La instancia de Bar se mantiene activa mientras exista una referencia a la instancia de Foo. Puede encontrar la instancia de Bar para la instancia de Foo mirando la tabla.

+0

magia perfecta, funciona como un encanto, gracias! – KoenJ

0

Es difícil dar sugerencias sin saber exactamente lo que estás tratando de lograr, o lo que quieres decir con "vivo". Normalmente no debería preocuparse por la vida útil de los objetos gestionados: "mueren" de forma natural cuando ya no se hace referencia a ellos.

Pero para hacer lo que parezca querer, su instancia Foo debe hacer referencia a la instancia Bar, o algún otro objeto debe hacer referencia a ambas para crear el enlace. Podría ser una referencia a una instancia Bar como System.Object, es decir, Foo no necesita saber acerca del tipo Bar.

0

La barra solo puede no estar finalizada si ALGO tiene una referencia al respecto. Solo haz que Foo diga esa cosa cuando pueda soltar a Bar.

+0

"Foo no tiene (y no puede tener) una relación con Bar" .. –

0

¿Se puede crear un campo público campo denominado BarReference en tipo Foo?
Alguien fuera de Foo debe establecer la instancia adecuada de Bar a esta propiedad.
Mientras haya una referencia a la instancia de la barra, no será codificada Y utilizando el objeto Foo no sabe nada sobre el tipo de barra.

+0

"Foo no tiene (y no puede tener) una relación con Bar" –

+0

** Tipo ** Foo no tiene relación con ** tipo ** Barra si usas un objeto como sugiero. Si no debe existir una relación semántica, este es otro caso. – ViktorZ

Cuestiones relacionadas