如果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));
}
}
假设:
IFoo的实例是否有资格进行垃圾回收?如果不是,有没有办法可以使用这种模式,以防止垃圾收集?
答案 0 :(得分:3)
MSDN page明确指出
但是,在ConditionalWeakTable类中,向表中添加键/值对并不能确保键会持久存在,即使可以直接从表中存储的值中获取该键...
所以它不会引起你担心的那种泄漏。