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的情況下都不能符合垃圾收集?如果沒有,我有沒有辦法使用這種模式,以避免垃圾回收?
哇,我不能相信我錯過了。謝謝! – fre0n