2014-05-10 70 views
2

如果ConditionalWeakTable中條目的值具有對其關鍵字的引用,是否會阻止將該關鍵字收集到垃圾?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的情況下都不能符合垃圾收集?如果沒有,我有沒有辦法使用這種模式,以避免垃圾回收?

回答

3

MSDN page特別指出

然而,在ConditionalWeakTable類,添加一個密鑰/值對的表不確保該鍵將持續,即使它可以直接從一個值達到存儲在表中...

所以它不會造成你擔心的泄漏。

+0

哇,我不能相信我錯過了。謝謝! – fre0n

相關問題