¿Es posible crear un diccionario con clave débil en C#?
.net dictionary (1)
Eche un vistazo a la clase ConditionalWeakTable <TKey, TValue> .
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.
¡Nota! Esta clase no usa GetHashCode
e Equals
para hacer comparaciones de igualdad, usa ReferenceEquals
.
Estoy tratando de WeakKeyedDictionary<,>
los detalles de un verdadero WeakKeyedDictionary<,>
para C # ... pero estoy WeakKeyedDictionary<,>
dificultades.
Me doy cuenta de que esta es una tarea no trivial, pero la aparente incapacidad de declarar un WeakKeyedKeyValuePair<,>
(donde el GC solo sigue la referencia de valor si la clave es alcanzable) lo hace aparentemente imposible.
Hay dos problemas principales que veo:
Cada implementación que he visto hasta ahora no recorta los valores después de que se han recolectado las claves. Piénselo: una de las principales razones para utilizar dicho diccionario es evitar que se mantengan esos valores (¡no solo las claves!), Ya que son inalcanzables, pero aquí las referencias fuertes lo señalan.
Sí, agregue / elimine del Diccionario lo suficiente y eventualmente serán reemplazados, pero ¿qué sucede si no lo hace?
Sin un hipotético
WeakKeyedKeyValuePair<,>
(u otro medio para decirle al GC que solo marque el valor si la clave es alcanzable), ningún valor queWeakKeyedKeyValuePair<,>
referencia a su clave nunca se recopilará. Esto es un problema cuando se almacenan valores arbitrarios.
El problema 1 podría abordarse de una manera bastante no ideal / atropellada: use Notificaciones de GC para esperar a que se complete un GC completo, y luego continúe y pode el diccionario en otro hilo. Este con el que estoy semi-bien.
Pero el problema 2 me ha dejado perplejo. Me doy cuenta de que esto es fácilmente contrarrestado por un "así que no hagas eso", pero me pregunto si este problema es posible de resolver.