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

本文关键字:事件 什么 之后 引用 对象 | 更新日期: 2023-09-27 18:05:53

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

:

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?
        }
    }
}

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

formBabySeal不是null只是因为你处理它。所以就叫formBabySeal.Close()

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

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

这将关闭表单(第一次调用Close),第二次调用不会做任何事情,因为表单已经关闭。

但是,正如Steve在注释部分指出的那样,您的代码将引入内存泄漏,因为Shoot仍然持有对formBabySealClose方法的引用,因此,只要类Hunter的实例是活动的,formBabySeal将保持活动。

带有SOS扩展的WinDBG可以显示任何对象的groot。这可能会给你更多的线索。