gpt4 book ai didi

c# - 我可以使 C# 对象的生命周期依赖于另一个对象吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:13 25 4
gpt4 key购买 nike

我有一个对象 (Delegate) 需要在另一个对象 (TargetObject) 处于事件状态时保持事件状态(不是垃圾收集)。我希望 Delegate 在收集 TargetObject 时被垃圾收集(或至少可用于收集)。

困难在于我不想从 TargetObject 引用 Delegate,因为我希望它为不知道 Delegate 的现有对象工作,并且我不想影响 TargetObject 的生命周期。这有可能吗?

谢谢。

编辑:感谢到目前为止的回复。我会尽力澄清我在做什么。

我正在尝试实现弱事件,但我不喜欢 WeakEventManager(尤其是 IWeakEventListener)。我想持有对委托(delegate)事件处理程序 (Delegate) 的弱引用,它指向对象 TargetObject 中的一个方法。在 TargetObject 处于事件状态时需要对 Delegate 进行强引用以保持 Delegate 事件,但如果具有较长生命周期的对象引用 Delegate,它会使 TargetObject 保持事件状态(破坏弱事件的目的)。

如果订阅弱事件的对象不必有任何特殊的实现细节,比如必须持有委托(delegate)集合,那就太好了。

编辑编辑:将“A”更改为“委托(delegate)”,将“B”更改为“目标对象”

最佳答案

神圣死灵,但是 ConditionalWeakTable 做你需要的。它允许将值与任意键相关联,键值对为 ephemerons (正是您 正在寻找的东西,2 年前的现在..不幸的是,当时 .NET 4 不可用)。

即使没有 ConditionalWeakTable一个解决方案可能是 Dictionary<WeakReference, Delegate> ,定期清除以删除旧的死值(即,每当 Dictionary 的大小加倍时,删除所有死对)。使用此解决方案,如果委托(delegate)引用 TargetObject,它会阻止收集对 - 一个问题 ConditionalWeakTable旨在解决。

只是张贴这个以防有人发现它有用。

关于c# - 我可以使 C# 对象的生命周期依赖于另一个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437216/

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