是否有可能在C#中创建一个真正的弱键词典?
我正试图为C#编写一个真正的是否有可能在C#中创建一个真正的弱键词典?,c#,.net,dictionary,garbage-collection,weak-references,C#,.net,Dictionary,Garbage Collection,Weak References,我正试图为C#编写一个真正的weakkeydictionary。。。但是我遇到了困难 我意识到这是一项不平凡的任务,但似乎无法声明weakkeydkeyvaluepair(如果可以访问密钥,则GC仅跟随值引用),这似乎是不可能的 我发现有两个主要问题: 到目前为止,我看到的每个实现都不会在收集键后修剪值。想想看——使用这样一个字典的主要原因之一是防止那些值被保留(不仅仅是键!),因为它们是不可访问的,但在这里它们被强引用指向 是的,从字典中添加/删除足够多的内容,它们最终会被替换,但是如果你不这
weakkeydictionary
。。。但是我遇到了困难
我意识到这是一项不平凡的任务,但似乎无法声明weakkeydkeyvaluepair
(如果可以访问密钥,则GC仅跟随值引用),这似乎是不可能的
我发现有两个主要问题:
weakkeydkeyvaluepair
(或者告诉GC仅在可以访问密钥时标记该值的另一种方法),任何引用其密钥的值都不会被收集。当存储任意值时,这是一个问题
注意!这个类不使用
GetHashCode
和Equals
来进行相等比较,它使用ReferenceEquals
真可惜,它的实现似乎依赖于内部.NET魔法“DependentHandle”。。此外,它会忽略.GetHashCode和.Equals,这使它充其量只是一个不合标准的字典:(.此外,如果没有访问DependentHandle,问题现在转移到定义一个WeakValuedDictionary。我想这可能是我们能得到的最接近的了。@Mania DependentHandle是CLR实现,没有GC合作是不可能实现的。它应该像GCHandle一样公开。如果你不介意反射的话诡计您可以将静态CLR方法转换为委托,并实现您自己的DependentHandle和WeakValuedDictionary。请仔细研究.NET引用源代码(它是公共的),或使用一些反编译器,因为它具有复杂的竞争条件。@Zarat:BTW,作为一个框架类,我希望看到的一件事是InternTable
(使用IEqualityComparer
作为构造参数)。给定一个T
的实例,确定该表是否已包含一个比较相等的条目。如果是,则比较该实例;否则,将提供的实例存储在表中并返回它。如果实现良好,这样的表可以极大地提高嵌套不可变类型的性能,在这些类型中,哈希代码可以非常轻松地执行能够区分不相等的实例,但比较相等实例的成本很高。@supercat:认为我们有点偏离主题:)如果您想进一步讨论,可以通过邮件或在我的博客上进行。要重新实现DependentHandle和一个新的类似于WeakReference处理GCHandle的Ephemeron类。我一直很感兴趣地关注此讨论。我建议您在其他地方继续讨论,并发布一个自我回答的问题和您的发现。请提供一个lin在这里,我可以继续关注这个话题。谢谢!