我能否使C#对象的生命周期依赖于另一个对象?

时间:2009-09-17 07:23:42

标签: c# object-lifetime

我有一个对象(Delegate)需要保持活着(不是垃圾收集)而另一个对象(TargetObject)是活着的。我希望在收集TargetObject时(或至少可用于收集)对Delegate进行垃圾回收。

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

感谢。

编辑:感谢目前为止的回复。我会试着澄清一下我的目标。

我正在尝试实现弱事件,但我不是WeakEventManager(特别是IWeakEventListener)的粉丝。我想对委托事件处理程序(Delegate)持有弱引用,该委托事件处理程序指向对象TargetObject中的方法。需要对Delegate有一个强引用,而TargetObject处于活动状态以保持Delegate活着,但是如果具有更长生命周期的东西引用Delegate,它会使TargetObject保持活动状态(挫败弱事件的目的)。

如果订阅弱事件的对象不必具有任何特殊的实现细节,例如必须保留委托集合,那将是很好的。

编辑编辑:将'A'更改为'委托',将'B'更改为'TargetObject'

5 个答案:

答案 0 :(得分:3)

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

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

只需张贴此内容,以防有人发现它有用。

答案 1 :(得分:2)

这听起来像是一个设计问题。如果B不需要知道A的实例,你为什么要关心A是否还活着?

你可以可能使用一个容器对象来做这个,该容器对象具有对B的弱引用和对A的强引用,并且定时器定期检查弱引用是否仍然存在...但它会是一个非常糟糕的黑客。

如果你能解释为什么你认为你需要这个,我们可能会建议一个更好的方法。

答案 2 :(得分:1)

为什么不从B中引用A? 这将使A保持活力,并且不需要A知道B ......

答案 3 :(得分:0)

我认为拥有一个没有任何引用的“活着”对象是不错的设计。

你总是可以创建一个静态列表,其中包含对应该保持活着的对象的引用,但当然你必须自己管理它。

我没有看到一个干净的解决方案,但也许StackOverflow上的一些超级人物会提出一个解决方案。

答案 4 :(得分:0)

在B的析构函数(finalize)方法中抛出一个事件,并为该事件编写一个杀死A的处理程序。