在它引用的对象被处置之后,事件会发生什么
本文关键字:事件 什么 之后 引用 对象 | 更新日期: 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
仍然持有对formBabySeal
的Close
方法的引用,因此,只要类Hunter
的实例是活动的,formBabySeal
将保持活动。
带有SOS扩展的WinDBG可以显示任何对象的groot。这可能会给你更多的线索。