C#.NET正确的事件订阅和取消订阅

时间:2010-07-13 20:11:07

标签: c# .net event-handling

我有一个连续运行的应用程序,它创建并销毁类,其中一些类具有鼠标点击事件之类的事件...... 第一个问题是取消订阅的正确方法是什么?如果订阅看起来像这样:

Panel1.MouseClick += new MouseEventHandler(Action_MouseClick);

取消订阅是否合适:

Panel1.MouseClick -= new MouseEventHandler(Action_MouseClick);

或者可以这样做:

Panel1.MouseClick -= Action_MouseClick;

或者两种方式都可以吗?

我的另一个问题是如果我使用Microsoft Visual C#studio通过设计器创建事件,它会自动取消订阅作为'Dispose'方法的一部分吗?或者我仍然需要在代码中放入取消订阅方法吗?

3 个答案:

答案 0 :(得分:2)

任何取消订阅的方式都会产生相同的效果,两者都是正确的。

至于你的另一个问题..如果你使用设计器为表单上的控件创建事件,当表单被处理时,事件的源不再存在,因此不会调用它们。我想我说没有必要分开这些事件。

答案 1 :(得分:1)

  

我的另一个问题是如果我使用了   Microsoft Visual C#studio创建   通过设计师的事件,确实如此   它会自动取消订阅   'Dispose'方法?或者我还是   需要将取消订阅方法纳入其中   代码?

从内存:不,它不会生成取消订阅代码。

您可以通过打开classname.designer.cs文件并检查生成的Dispose方法来自行仔细检查。

答案 2 :(得分:1)

设计器代码不会自动取消订阅,但只要表单及其所有控件不再可从应用程序代码访问,订阅就不应保持控件处于活动状态。当订阅者和事件生成者具有不同的生命周期时,延迟事件处理程序主要是一个问题,这通常不应该是表单及其控件的情况。

如果您动态创建/删除控件,您可能希望管理事件,但如果不再引用已删除的控件并且删除的控件停止触发事件,则不一定非必要。