0

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

所以控件CustomContainer有5个CustomButtons。

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

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

谢谢。

4

3 回答 3

1

大多数涉及控制事件的情况下,可以放弃事件而不进行处理,也不会遇到麻烦,因为事件发布者和订阅者通常会同时超出范围。在某些方面,这是不幸的,因为如果事件清理被认为是正确性所必需的,那么可能会有语言支持,并且任何写得体面的代码都会理所当然地清理事件。

问题是任何阻止被废弃事件发布者被垃圾收集的东西也会阻止它的任何订阅者被垃圾收集。如果这些订阅者发布了他们自己的任何事件,那么他们的所有订阅者也将不必要地免受垃圾收集等的影响。例如,假设一个人有一个运行良好的程序,但是一个人添加了一个事件来让表单知道当打开或关闭另一个表单时,每个表单都可以有一个“Windows”菜单列出其他打开的表单。不错的功能。但是,如果在未取消订阅提供此类通知的事件的情况下处置表单,则此类失败可能会阻止表单或其任何控件或这些事物所引用的任何其他对象被收集。严重的内存泄漏,

我的建议是使用表单的Disposed事件来处理事件清理。可以更改Dispose设计器生成的代码,而设计器可能会不理会这些更改,但鉴于Disposed事件存在,我认为避免对设计器生成的文件进行任何修补会更干净。

于 2012-04-13T15:34:41.173 回答
1

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

于 2012-04-13T10:52:15.553 回答
0

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

于 2012-04-13T10:57:13.010 回答