我正在尝试为C#创建一个真正的WeakKeyedDictionary<,>
,但是我遇到了困难。
我意识到这是一个非平凡的任务,但似乎无法声明一个WeakKeyedKeyValuePair<,>
(仅在键可达时GC才会跟随值引用),因此看起来似乎不可能。
我看到两个主要问题:
迄今为止我见过的所有实现都没有在收集键之后修剪值。想想看 - 使用这种字典的主要原因之一是防止这些值被保留(不仅仅是键!)因为它们是不可达的,但是这里它们仍然通过强引用指向。
是的,如果在字典中添加/删除足够多的条目,它们最终会被替换,但如果您没有这样做呢?
没有一个假设的
WeakKeyedKeyValuePair<,>
(或者另一种只在键可达时告诉GC标记值的方法),任何引用其键的值都永远不会被收集。这在存储任意值时是一个问题。
问题1可以通过一种不太理想/麻烦的方式来解决:使用GC通知等待完成完整的GC,然后在另一个线程中修剪字典。这一点我有点满意。
但是问题2让我困惑。我意识到这很容易被“那就不要那么做”所解决,但是这个问题是否可能被解决呢?
InternTable<T>
(带有IEqualityComparer<T>
作为构造参数)。给定一个T
的实例,确定表中是否已经存在一个与之相等的条目。如果是,则比较该实例;否则,将提供的实例存储在表中并返回它。如果实现得好,这样的表可以极大地提高嵌套不可变类型的性能,其中哈希码可以相当可靠地区分不相等的实例,但比较相等的实例很昂贵。 - supercat