在它引用的对象被处理后,事件会发生什么?

时间:2011-08-18 13:04:10

标签: c# events delegates

如果我将某个对象的方法链接到委托,然后处理该对象会发生什么?

像这样:

class Hunter
{
    public event Action Shoot;

    public execute()
    {
        Form formBabySeal = new Form();

        Shoot += formBabySeal.Close;

        formBabySeal.Show();
        formBabySeal.Close(); //Dispose Form

        if (Shoot != null)
        {
             Shoot(); //event is null?
        }
    }
}

2 个答案:

答案 0 :(得分:1)

formBabySeal不是null只是因为你处理它。因此,formBabySeal.Close()将被调用。

在查看调用的方法时,您的代码与此相同:

Form formBabySeal = new Form();

formBabySeal.Show();
formBabySeal.Close(); //Dispose Form
formBabySeal.Close();

这将关闭表单(第一次调用Close),第二次调用将不会执行任何操作,因为表单已经关闭。

但是,正如Steve在评论部分指出的那样,您的代码会引入内存泄漏,因为Shoot仍然保留对Close formBabySeal方法的引用,因此只要班级formBabySeal的实例存活,Hunter就会保持活着。

答案 1 :(得分:0)

带有SOS扩展的WinDBG可以显示任何对象的GCRoot。这可能会为您提供更多线索。