ConditionalWeakTable的值是否会导致内存泄漏?

时间:2014-05-10 16:56:16

标签: c# memory-leaks garbage-collection weak-references

如果ConditionalWeakTable中的条目的值具有对其键的引用,是否会阻止该键被垃圾回收?

假设您有一个界面和该界面的装饰器。装饰者对它的装饰有一个参考。

public interface IFoo
{
}

public class FooDecorator : IFoo
{
    private readonly IFoo _foo;

    public FooDecorator(IFoo foo)
    {
        _foo = foo;
    }
}

让我们说你有一个使用ConditionalWeakTable<IFoo, FooDecorator>的扩展方法类,这样每次调用扩展方法时,每个IFoo实例都可以检索相同的FooDecorator实例。

public static class FooExtensions
{
    private static readonly ConditionalWeakTable<IFoo, FooDecorator> _decorators =
        new ConditionalWeakTable<IFoo, FooDecorator>();

    public static IFoo GetDecorator(this IFoo foo)
    {
            return
                foo as FooDecorator // don't decorate the decorator
                ?? _decorators.GetValue(foo , f => new FooDecorator(f));
    }
}

假设:

  • FooDecorator作为ConditionalWeakTable中的值存在,可由IFoo实例检索;和
  • FooDecorator拥有对同一个IFoo实例的强引用

IFoo的实例是否有资格进行垃圾回收?如果不是,有没有办法可以使用这种模式,以防止垃圾收集?

1 个答案:

答案 0 :(得分:3)

MSDN page明确指出

  

但是,在ConditionalWeakTable类中,向表中添加键/值对并不能确保键会持久存在,即使可以直接从表中存储的值中获取该键...

所以它不会引起你担心的那种泄漏。