gpt4 book ai didi

c# - 是否可以在 C# 中创建一个真正的弱键字典?

转载 作者:IT王子 更新时间:2023-10-29 04:30:47 26 4
gpt4 key购买 nike

我正试图找出一个真实的细节 WeakKeyedDictionary<,>对于 C#...但我遇到了困难。

我意识到这是一项非常重要的任务,但似乎无法声明 WeakKeyedKeyValuePair<,> (GC 仅在键可访问时才遵循值引用)让它看起来不可能。

我发现有两个主要问题:

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

    是的,从词典中添加/删除的次数足够多,它们最终会被替换,但如果你不这样做怎么办?

  2. 没有假设 WeakKeyedKeyValuePair<,> (或告诉 GC 仅在键可访问时才标记该值的另一​​种方法)永远不会收集任何引用它的键的值。这是存储任意值时的问题。

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

但是问题 2 让我难住了。我意识到这很容易被“所以不要那样做”所抵消,但这让我想知道 - 这个问题是否有可能解决?

最佳答案

看看 ConditionalWeakTable<TKey, TValue> Class .

Enables compilers to dynamically attach object fields to managed objects.

它本质上是一个字典,其中键和值都是 WeakReference ,只要键还活着,值就会一直活着。

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

关于c# - 是否可以在 C# 中创建一个真正的弱键字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com