动态事件处理

本文关键字:事件处理 动态 | 更新日期: 2023-09-27 17:59:03

这里有一个随机问题。

我有一个叫猴子的物体,还有一个叫香蕉的物体。Banana暴露了一个名为Ripens的事件,Monkey对象订阅了该事件。当Ripens事件被触发时,Monkey调用其Consume()函数,该函数反过来会破坏Banana对象。

示例:

//And yes, I know this isnt real C# code. Just trying to get my point across and
//not necessarily be syntatically correct with this exmaple.
public class Banana
{
    public event Ripens;
}
public class Monkey
{
    public Monkey()
    {
        List<Banana> tree = new List<Banana>();
        for (int i = 0; i < 8; i ++)
        {
             tree.Add(new Banana());
             tree[i].Ripens += this.Consume;        
        }
    }
    public void Consume(Banana b)
    {
         tree.Remove(b);
         b.Destroy();
    }
}

所以我的问题是:猴子是否会为每一根在没有事先取消订阅的情况下被摧毁的香蕉流血。或者Monkey中的事件处理程序会和香蕉一起被破坏?

动态事件处理

当monkey订阅香蕉时,香蕉现在有了对猴子的引用,而monkey没有对香蕉的引用。在你的例子中,当香蕉上升时,它们现在被垃圾收集。所以不,猴子不会泄露内存。

事件的"内存泄漏"实际上发生在另一个方向。如果猴子超出范围,香蕉事件仍然引用猴子上的事件委托,因此猴子不会得到垃圾回收。

为了解决"每个"问题,是的——事件处理程序是针对每个对象的。因此,超出范围的多个订阅者仍然可以通过事件发布器引用它们,从而导致它们不会被垃圾收集。