我应该手动删除我声明的事件处理程序吗?

本文关键字:事件处理 程序 声明 删除 我应该 | 更新日期: 2023-09-27 18:04:17

好的,在这里做一个例子:

  1. 我有UserControl A, UserControl B, UserControl C和一个Windows窗体。
  2. UserControl C有[Next]和[Back]按钮。
  3. 例如,UserControl A是用事件处理程序声明的。UserControl A中的一个函数实际上会引发事件调用来执行UserControl c中的一个函数。
  4. 在UserControl C中,我需要添加

" UserControlA。OneFunction += this.UserControlC_Function;"

  1. 如果我点击下一步按钮在用户控制C,它将处置用户控制A和添加新的用户控制B到Windows窗体。但是我从来没有手动删除这个事件处理程序。

UserControl A中的一个函数是调用者(声明事件的地方)。
UserControl C中的一个功能是监听器。

所以,这些是我的问题:

  • 我应该在UserControl A被处置之前手动删除处理程序吗?
  • 这个用户控件A会自动删除先前声明的处理程序吗?
  • 我应该在某个地方添加这个吗?

" UserControlA。OneFunction -= this.UserControlC_Function;"

我应该手动删除我声明的事件处理程序吗?

    按照惯例,我们不这样做。并且由于处置后不应该调用事件,所以没有必要这样做,除非所讨论的控件行为异常。
  1. 。至少从反射镜上看没有这样的代码。

在这种情况下,您不需要删除处理程序,因为表单及其按钮都不会被表单外部的代码引用,因此整个对象图将被垃圾收集

这篇文章的答案很好地解释了什么时候需要手动删除事件处理程序,什么时候不需要。

是否需要在孤立对象之前从对象中删除事件订阅?

如果表单被释放(假设没有其他对象对有问题的对象有引用),那么不删除事件处理程序的风险很小,但是在对象侦听无法再到达之前总是删除事件处理程序是一个好主意(即所有引用对象的变量超出作用域),不这样做可以创建内存泄漏。

这不是你的情况(如果我得到你所描述的,代码会使它更清楚)问题是,如果你将一个引用对象C的委托附加到对象a上的一个事件,然后失去对C的访问权限(例如,给变量赋一个新值)。然后C会一直挂着,直到A被垃圾收集

如果事件发布者的内存生命周期相对于事件订阅者的有效生命周期没有限制,则未能取消订阅事件可能会导致内存泄漏。如果不是因为这样做带来了不幸的麻烦,就没有理由不取消所有事件的订阅,也没有理由不取消所有事件订阅。然而,由于c#和VB都没有提供任何方便的方法来做这些事情,因此必须在适当的订阅处理的麻烦与在许多情况下可以逃避的事实之间取得平衡。