Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有可能在C#中创建一个真正的弱键词典?_C#_.net_Dictionary_Garbage Collection_Weak References - Fatal编程技术网

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

是否有可能在C#中创建一个真正的弱键词典?,c#,.net,dictionary,garbage-collection,weak-references,C#,.net,Dictionary,Garbage Collection,Weak References,我正试图为C#编写一个真正的weakkeydictionary。。。但是我遇到了困难 我意识到这是一项不平凡的任务,但似乎无法声明weakkeydkeyvaluepair(如果可以访问密钥,则GC仅跟随值引用),这似乎是不可能的 我发现有两个主要问题: 到目前为止,我看到的每个实现都不会在收集键后修剪值。想想看——使用这样一个字典的主要原因之一是防止那些值被保留(不仅仅是键!),因为它们是不可访问的,但在这里它们被强引用指向 是的,从字典中添加/删除足够多的内容,它们最终会被替换,但是如果你不这

我正试图为C#编写一个真正的
weakkeydictionary
。。。但是我遇到了困难

我意识到这是一项不平凡的任务,但似乎无法声明
weakkeydkeyvaluepair
(如果可以访问密钥,则GC仅跟随值引用),这似乎是不可能的

我发现有两个主要问题:

  • 到目前为止,我看到的每个实现都不会在收集键后修剪值。想想看——使用这样一个字典的主要原因之一是防止那些值被保留(不仅仅是键!),因为它们是不可访问的,但在这里它们被强引用指向

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

  • 如果没有一个假设的
    weakkeydkeyvaluepair
    (或者告诉GC仅在可以访问密钥时标记该值的另一种方法),任何引用其密钥的值都不会被收集。当存储任意值时,这是一个问题

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

    但问题2把我难住了。我意识到这很容易被一句“所以不要那样做”来反驳,但这让我想知道——这个问题是否有可能解决呢?

    看看这个问题

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

    它本质上是一个字典,其中键和值都是a,并且只要键处于活动状态,值就保持活动状态


    注意!这个类不使用
    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在这里,我可以继续关注这个话题。谢谢!