Recientemente me encontré con la clase ConditionalWeakTable<TKey,TValue>
en mi búsqueda de un IDictionary
que utiliza referencias débiles, como se sugiere en las respuestas here y here.¿Debería ConditionalWeakTable <TKey, TValue> utilizarse con fines no compiladores?
Hay a definitive MSDN article que introdujo la clase y que establece:
puede encontrar la clase ... en el espacio de nombres System.Runtime.CompilerServices. Está en CompilerServices porque no es un tipo de diccionario de propósito general: pretendemos que solo sea utilizado por los escritores de compilación.
y más tarde de nuevo:
... la mesa débil condicional no pretende ser una colección de propósito general ... Pero si usted está escribiendo un lenguaje .NET de su propia necesidad y para exponer la capacidad de adjuntar propiedades a los objetos, definitivamente debe buscar en la Tabla Débil Condicional.
En línea con esto, la descripción entrada MSDN de la clase lee:
Habilita compiladores para unir dinámicamente campos de objeto a los objetos gestionados.
Así que, obviamente, fue creado originalmente para un propósito muy específico: ayudar al DLR, y el espacio de nombres System.Runtime.CompilerServices
encarna esto. Pero parece haber encontrado un uso mucho más amplio que eso, incluso dentro del CLR. Si busco referencias de ConditionalWeakTable en ILSpy, por ejemplo, puedo ver que se utiliza en la clase MEF CatalogExportProvider
y en la clase interna WPF DataGridHelper
, entre otros.
Mi pregunta es si está bien usar ConditionalWeakTable fuera de las herramientas de escritura y lenguaje del compilador, y si existe algún riesgo al hacerlo en términos de incurrir en gastos adicionales o de la implementación que cambia significativamente en futuras versiones de .NET. (O debería evitarse y se debe usar una implementación personalizada como this one en su lugar).
También hay lecturas adicionales here, here y here acerca de cómo el ConditionalWeakTable hace uso de una aplicación CLR oculta de ephemerons (a través de System.Runtime.Compiler.Services. DependentHandle
) para lidiar con el problema de ciclos entre claves y valores, y cómo esto no puede fácilmente llevarse a cabo de manera personalizada.
Gracias, lo marcaré como la respuesta. Creo que tiene usted razón: quiero un diccionario que utilice referencias débiles, por lo que ConditionalWeakTable no debería introducir más sobrecarga en comparación con cualquier otra implementación que utilice referencias débiles, con la ventaja adicional de utilizar efemerones. – Riko
Estaba realmente entusiasmado con la disponibilidad de ConditionalWeakTable, pero noté esto en la documentación: "No puede controlar las comparaciones de igualdad anulando Object.GetHashCode para establecer explícitamente el código hash para una clave. La clase ConditionalWeakTable no utilice el método Object.GetHashCode para calcular códigos hash y, por lo tanto, no invoca Object.GetHashCode anula ". - Hacer que no sea útil para mis propósitos. :( –
ctrlplusb
@Sean: no hay forma de que 'ConditionalWeakTable' use otra cosa que no sea la identidad de referencia para las claves, ya que sería imposible (Halting Problem) para saber cuándo ya no era posible que el código proporcionara una clave que debe coincidir con un elemento en la colección. – supercat