是否有可能在C#中创建一个真正弱键的字典?

我正试图为C#确定一个真正的WeakKeyedDictionary的细节……但我遇到了困难。

我意识到这是一个非常重要的任务,但似乎无法声明WeakKeyedKeyValuePair (如果密钥可达,GC只跟随值引用)使得它看起来似乎不可能。

我看到两个主要问题:

  1. 到目前为止,我所看到的每个实现都没有在收集密钥后修剪值。 考虑一下 – 使用这样一个词典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向。

    是的,在词典中添加/删除足够多,它们最终会被替换,但如果你不这样做呢?

  2. 如果没有假设的WeakKeyedKeyValuePair (或者告诉GC只在密钥可达时标记值的其他方法),任何引用它的密钥的值都不会被收集。 存储任意值时,这是一个问题。

问题1可能以相当不理想/不熟练的方式解决:使用GC通知等待完整的GC完成,然后继续并在另一个线程中修剪字典。 这个我半熟。

但问题2让我难过。 我意识到这很容易被“所以不要这样做”所抵消,但它让我感到疑惑 – 这个问题甚至可以解决吗?

看看ConditionalWeakTable Class 。

使编译器能够将对象字段动态附加到托管对象。

它本质上是一个字典,其中键和值都是WeakReference ,只要键处于活动状态,该值就会保持活动状态。

注意! 该类不使用GetHashCodeEquals进行相等比较,它使用ReferenceEquals