我应该为具有事件处理程序的用户控件实现Dispose吗?

时间:2012-04-13 10:49:03

标签: c# custom-controls dispose

我有一个Custom控件CustomContainer,它包含另一系列自定义控件(CustomButtons)。

因此控件CustomContainer有5个CustomButtons's。

每个CustomButtons都有和Click事件处理程序在CustomContainer的构造函数中连接。

我是否需要编写一个覆盖Dispose for Control CustomContainer(因为它继承自UserControl,有一个Dispose)来取消连接这些CustomButtons事件处理程序?标准配置是否足够或我在这里有内存泄漏?

谢谢, 甲

3 个答案:

答案 0 :(得分:1)

不,您不需要实施IDisposable并仅实施Dispose() 来从您拥有的事件处理程序取消订阅。您拥有的事件处理程序(按钮点击,根据帖子)不会导致内存泄漏。

答案 1 :(得分:1)

涉及控制事件的大多数案例中,可以放弃事件而不处理它们而不会遇到麻烦,因为事件发布者和订阅者通常会在同一时间超出范围。在某些方面,这是不幸的,因为如果认为事件清理对于正确性是必要的,那么可能会有语言支持,任何体面编写的代码都会清理事件。

问题在于任何使被遗弃的事件发布者不被垃圾收集的事情也会阻止其任何订阅者被垃圾收集;如果这些订阅者发布他们自己的任何事件,他们的所有订阅者同样将被不必要地避免垃圾收集等。例如,假设一个人有一个工作得很漂亮的程序,但是一个人添加一个事件来让一个表单知道当打开或关闭另一个表单时,每个表单都可以有一个列出其他打开表单的“Windows”菜单。不错的功能。但是,如果在没有取消提供此类通知的事件的情况下处理表格,则此类故障可能会阻止表格或其任何控制,或这些事物所引用的任何其他对象被收集。显着的内存泄漏,但如果在程序的生命周期中打开和关闭多个文档,则可能只会导致问题,并且除了最终用户之外可能因此无法发现。

我的建议是使用表单的Disposed事件来处理事件清理。可以更改设计器生成的Dispose代码,设计人员可能会单独留下这些更改,但鉴于存在Disposed事件,我认为避免对设计师进行任何修改会更加清晰 - 生成的文件。

答案 2 :(得分:0)

IDisposable用于清理非托管资源。垃圾收集器清理所有托管资源。当没有对该对象的更多引用时,下次GC运行时它将释放从应用程序无法访问的所有内容。