我正在努力为C#确定真正WeakKeyedDictionary<,>
的细节......但我遇到了困难。
我意识到这是一项非常重要的任务,但似乎无法声明WeakKeyedKeyValuePair<,>
(如果密钥可以访问,GC只跟随值引用),这看起来似乎是不可能的。
我看到两个主要问题:
我到目前为止看到的每个实现都没有在收集密钥后修剪值。考虑一下 - 使用这样一个字典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向。
是的,在词典中添加/删除足够多,他们最终会被替换,但如果你不这样做呢?
如果没有假设的WeakKeyedKeyValuePair<,>
(或其他方法告诉GC仅在密钥可达时标记值),任何引用其密钥的值都不会被收集。存储任意值时会出现问题。
问题1可能以相当不理想/不熟练的方式解决:使用GC通知等待完整的GC完成,然后继续并在另一个线程中修剪字典。这个我半熟的。
但问题2让我难过。我意识到这很容易被“所以不要这样做”所抵消,但它让我感到疑惑 - 这个问题甚至可以解决吗?
答案 0 :(得分:28)
查看ConditionalWeakTable<TKey, TValue> Class。
使编译器能够将对象字段动态附加到托管对象。
它本质上是一个字典,其中键和值都是WeakReference,只要键处于活动状态,该值就会保持活动状态。
请注意!此类不使用GetHashCode
和Equals
进行相等比较,而是使用ReferenceEquals
。