2010-07-13 262 views
2

我有一个连续运行的应用程序,它创建和销毁类其中有一些像鼠标点击事件和事件等等...... 第一个问题是什么是正确的方法退订?如果订阅这个样子的:C#.NET合适的事件订阅和取消订阅

Panel1.MouseClick += new MouseEventHandler(Action_MouseClick); 

是正确的退订这样的:

Panel1.MouseClick -= new MouseEventHandler(Action_MouseClick); 

还是确定要做到这一点:

Panel1.MouseClick -= Action_MouseClick; 

或者是无论哪种方式好不好?

我的另一个问题是,是,如果我使用微软的Visual C#工作室通过设计人员创建的事件,它会自动退订的“处置”方法的一部分?或者我仍然需要在代码中放置取消订阅方法?

回答

2

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

至于你的其他问题。如果您使用设计的窗体上创建控件的事件,当窗体被设置在事件源不再存在,所以他们不会被调用。我想我说的是没有必要拆除这些事件。

+0

感谢qstarin ......我注意到,如果类已经得到妥善处置,如果我不退订一些由设计者设定的事件的节目会慢慢泄漏内存和我想知道,这意味着双击上设计器中的Button将创建buttonClick事件。但我并没有赞成这些事件。 根据文章: “http://msdn.microsoft.com/en-us/library/ms366768%28VS.80%29.aspx” 林想知道如果垃圾收集器是从堆中删除对象如果我没有参加这些活动。 – ecklerpa 2010-07-13 20:24:17

+0

从那篇文章中,“只要发布对象拥有该引用,您的订阅对象就不会被垃圾收集。“ 表单上的一个控件是发布对象,对控件的唯一引用是其表单中的成员变量(通常是这种情况,除非你特别保留对控件的引用),因此,一旦表单不见了,GC不能达到控制,因此不能到达组播代理 所有引用无法访问,应该收集 – 2010-07-13 20:39:51

+0

另外,作为一个健全性检查,我会认为,如果设计器自动订阅,但不自动取消订阅,导致内存泄漏,然后一大堆.Net应用程序会有这个问题 - 也许很明显,情况并非如此(或者我们会听到更多,是的) – 2010-07-13 20:41:18

1

我的另一个问题是,是,如果我使用 微软的Visual C#工作室通过设计人员创建 的事件,并 它会自动退订的“处置”方法的一部分 ?或者我仍然需要 的取消订阅方法在 的代码?

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

您可以双击打开该文件classname.designer.cs并检查产生Dispose方法来检查这个自己。

+0

你是对的,它不是。 – 2010-07-13 20:14:10

+0

谢谢你们!我很感激它...... – ecklerpa 2010-07-13 20:37:34

+0

只是一个更新......它确实有助于使用您创建的软件的“发布”版本...我发现系统将比“调试”更好地移除分配给应用程序的内存,版本。 – ecklerpa 2010-07-19 21:51:33

1

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

如果你创建/删除动态控制,你可能要管理的事件,虽然这不是绝对必要的,删除的控制不再被引用和移出的对照停止射击的事件。