相关疑难解决方法(0)

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

我正试图坚持WeakKeyedDictionary<,>C#的真实细节......但我遇到了困难.

我意识到这是一个非常重要的任务,但似乎无法声明a WeakKeyedKeyValuePair<,>(如果密钥可达,GC只跟随值引用)使得它看起来似乎不可能.

我看到两个主要问题:

  1. 到目前为止,我所看到的每个实现都没有在收集密钥后修剪值.考虑一下 - 使用这样一个字典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向.

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

  2. 如果没有一个假设WeakKeyedKeyValuePair<,>(或告诉GC到的另一种方法只标出值,如果关键是可达)是指它的键永远不会被收集的任何值.存储任意值时,这是一个问题.

问题1可以在一个相当不理想/ hackish的方式来解决:使用GC通知等待一个完整的GC完成,然后沿着去修剪字典在另一个线程.这个我半熟的.

但问题2让我难过.我意识到这很容易被"所以不要这样做"所抵消,但我想知道 - 这个问题甚至可以解决吗?

.net c# dictionary garbage-collection weak-references

22
推荐指数
1
解决办法
4459
查看次数

压缩WeakReference词典

我有一个带有属性Id的Foo类.我的目标是同时没有两个具有相同IdFoo实例.

所以我创建了一个工厂方法CreateFoo,它使用缓存来为同一个Id返回相同的实例.

static Foo CreateFoo(int id) {
    Foo foo;
    if (!cache.TryGetValue(id, out foo)) {
        foo = new Foo(id);
        foo.Initialize(...);
        cache.Put(id, foo);
    }
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

缓存实现为Dictionary <TKey,WeakReference>,基于@JaredParBuilding a WeakReference Hashtable:

class WeakDictionary<TKey, TValue> where TValue : class {
    private readonly Dictionary<TKey, WeakReference> items;
    public WeakDictionary() {
        this.items = new Dictionary<TKey, WeakReference>();
    }
    public void Put(TKey key, TValue value) {
        this.items[key] = new WeakReference(value);
    }
    public …
Run Code Online (Sandbox Code Playgroud)

c# weak-references .net-4.0

16
推荐指数
2
解决办法
5581
查看次数