在C#中是否有Java WeakHashMap类的等价物?

Dan*_*rry 12 .net c# collections multithreading concurrent-collections

是否有一个C#类提供弱键或/和弱值的映射?或至少WeakHashMap之类的功能.

Jar*_*Par 17

在.Net 3.5及更低版本中,没有这样的结构可用.但是我为一个辅助项目编写了一个,并将代码发布在以下位置.

从.NET 4.0开始,ConditionalWeakTable在Runtime.CompilerServices命名空间中调用了一个可用的结构.


Sam*_*ell 6

在.NET 4之前,CLR没有提供实现此表单映射所需的功能.特别是,Java提供了ReferenceQueue<T>类,WeakHashMap用于管理映射中的弱键.由于.NET中没有与此类相同的内容,因此没有简洁的方法来构建等效项Dictionary.

在.NET 4中,ConditionalWeakTable<TKey, TValue>添加了一个新类,作为提高CLR支持动态语言的能力的一部分.此类使用新类型的垃圾收集句柄,该句柄在CLR本身内实现,并通过内部DependentHandle结构在mscorlib.dll中公开.

这意味着以下内容:

  1. 没有WeakHashMap与.NET 4之前的版本相同的版本.
  2. 从.NET 4开始,至少继续通过.NET 4.5.1,支持功能的唯一方法WeakHashMap是使用ConditionalWeakTable类(密封).

其他信息可在以下文章中找到:
是否可以在C#中创建一个真正弱键的字典?


Joh*_*lla 5

最接近的平台可能是一个Dictionary<K, WeakReference<V>>.也就是说,它只是一个普通的字典,但值是弱引用.

  • 你混淆了什么,关键必须是弱而不是价值,抱歉只是重读问题. (4认同)
  • 实际上,弱键也非常有用.例如在缓存中.但是只使用WeakReferences和Dictionary它们更难实现. (4认同)
  • 它说"弱键或/和弱值".弱值可能比弱键更可取 - 您不需要弱键和强值,因为如果键过期,您无法获得价值! (3认同)
  • -1:这可能属于原始帖子的一个特定解释,但它肯定不是*任何*像标题,它要求在C#中等同于'WeakHashMap`的东西.你的字典使用对键的强引用,这与`WeakHashMap`完全不同. (2认同)