我可以使C#对象的生命周期取决于另一个对象吗?
我有一个对象(委托)需要保持活着(而不是垃圾收集),而另一个对象(TargetObject)是活着的。 当收集TargetObject(或至少可用于收集)时,我希望Delegate被垃圾回收。
困难在于我不想引用TargetObject中的委托,因为我希望它能为不知道Delegate的现有对象工作,并且我不想影响TargetObject的生命周期。 这是可能吗?
谢谢。
编辑:感谢迄今的回应。 我会尽力澄清我的意图。
我试图实现弱事件,但我不是WeakEventManager的粉丝(尤其是IWeakEventListener)。 我想持有一个指向对象TargetObject中方法的委托事件处理程序(委托)的弱引用。 当TargetObject处于活动状态时需要有一个强有力的参考,以保持Delegate活着,但如果具有较长生命周期的事件引用了Delegate,它会使TargetObject保持活动状态(破坏弱事件的目的)。
如果订阅弱事件的对象不必有任何特殊的实现细节,例如不得不坚持一组代表,那将会很好。
编辑编辑:将'A'更改为'委托'和'B'更改为'TargetObject'
神圣的necro,但ConditionalWeakTable
只是你所需要的。 它允许将值与任意键相关联,并将键值对作为ephemerons(正是您在寻找的内容,2年前现在......不幸的是.NET 4不可用)。
即使没有ConditionalWeakTable
,解决方案也可能是一个Dictionary<WeakReference, Delegate>
,它定期清除旧的死亡值(即每当字典的大小加倍,删除所有死对)。 有了这个解决方案,如果Delegate引用TargetObject,它会阻止收集对 - ConditionalWeakTable
旨在解决的问题。
只要发布这个,以防有人发现它有用。
这听起来像是一个设计问题。 如果B不需要知道A的实例,为什么你关心A是否还活着?
你可以用一个容器对象来做这件事,这个容器对象具有对B的弱引用和对A的强引用,并且定时器会定期检查弱引用是否仍然存在......但这将是一个非常糟糕的破解。
如果你能解释为什么你认为你需要这个,我们可能会提出一个更好的方法。
你为什么不从B引用A?
这将使A保持活力,并且不需要A知道B ...
上一篇: Can I make a C# object's lifetime depend on another object?
下一篇: Is it necessary to explicitly remove event handlers in C#