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

时间:2010-01-17 15:59:28

标签: c# .net multithreading collections concurrent-collections

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

3 个答案:

答案 0 :(得分:17)

在.Net 3.5及以下版本中,没有这样的结构。但是我为一个辅助项目编写了一个,并在following location发布了代码。

启动.NET 4.0时,Runtime.CompilerServices命名空间中有一个名为ConditionalWeakTable的结构,它也可以实现。

答案 1 :(得分:6)

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

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

这意味着以下内容:

  1. 在.NET 4之前没有等效的WeakHashMap
  2. 从.NET 4开始,至少继续通过.NET 4.5.1,支持WeakHashMap功能的唯一方法是使用ConditionalWeakTable类(密封)。< / LI>

    更多信息见以下帖子:
    Is it possible to create a truely weak-keyed dictionary in C#?

答案 2 :(得分:5)

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