1

我有一个派生自 System.Windows.Form.Form 的“MyForm”。MyForm 处理我在构造函数中设置的处理程序的 FormClosed 事件。实例化的 MyForm 对象是否可以使用 -= 成功删除我的 MyClass#FormClosed 处理程序?如果这很重要,我正在使用匿名方法来连接我的 FormClosed 事件。

// In MyForm Constructor, this ALWAYS gets fired...
FormClosed += (_sender, _args) => { m_mutex.Dispose(); m_mutex = null; };

// In Instantiating Class
MyForm form = new MyForm();
form.FormClosed += (_sender, _args) => {  };

// I have also tried using "delegate(object sender, EventArgs e)" and neither worked.
4

2 回答 2

3

是的,你可以删除它——但如果你使用了匿名函数,那就有点棘手了。

基本上,您要么需要停止使用匿名函数(即将行为放入方法中),要么需要有一个字段来存储委托的值:

private EventHandler formClosedHandler;
...

// In constructor
formClosedHandler = (sender, args) => { ... };
FormClosed += formClosedHandler;

// Later...
FormClosed -= formClosedHandler;
formClosedHandler = null;

就个人而言,我更倾向于将逻辑转移到方法中,除非由于某种原因它真的很棘手。

于 2011-07-12T15:18:48.703 回答
0

是的,您可以取消订阅任何事件,即使在Disposed()方法中也是如此。

于 2011-07-12T15:20:19.530 回答