gpt4 book ai didi

c# - ConditionalWeakTable 的值会导致内存泄漏吗?

转载 作者:行者123 更新时间:2023-11-30 22:06:32 27 4
gpt4 key购买 nike

如果 ConditionalWeakTable 中条目的值引用了它的键,它是否会阻止键被垃圾收集?

假设您有一个接口(interface)和该接口(interface)的装饰器。装饰器持有对其装饰物的引用。

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 的实例是否有资格进行垃圾回收?如果不是,是否有一种方法可以使用此模式,以便不阻止垃圾收集?

最佳答案

MSDN page特别指出

However, in the ConditionalWeakTable class, adding a key/value pair to the table does not ensure that the key will persist, even if it can be reached directly from a value stored in the table ...

因此它不会导致您担心的那种泄漏。

关于c# - ConditionalWeakTable 的值会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23583892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com