Vb.net AddHandler/RemoveHandler未正确处理

Vb.net AddHandler/RemoveHandler未正确处理,vb.net,.net-2.0,Vb.net,.net 2.0,使用AddHandler方法,如果我从未使用RemoveHandler,在某些情况下会导致内存泄漏吗?我不太确定这件事的真相 与C#?相反,VB中是否存在导致内存泄漏的其他原因?如果对象a被用于对象b事件,则在收集对象a之前,不会收集对象b 事件订阅计数为对发布者对象的引用 是的,这种情况也发生在C上,我与语言无关。通常情况下,它与语言无关。。但这种可能性是存在的。 订阅事件时,基本上是将方法的委托(如果愿意,可以使用func指针)交给事件发布者,只要不使用-=运算符取消订阅,事件发布者就会保留

使用
AddHandler
方法,如果我从未使用
RemoveHandler
,在某些情况下会导致内存泄漏吗?我不太确定这件事的真相


与C#?

相反,VB中是否存在导致内存泄漏的其他原因?如果对象a被用于对象b事件,则在收集对象a之前,不会收集对象b

事件订阅计数为对发布者对象的引用

是的,这种情况也发生在C上,我与语言无关。

通常情况下,它与语言无关。。但这种可能性是存在的。
订阅事件时,基本上是将方法的委托(如果愿意,可以使用func指针)交给事件发布者,只要不使用-=运算符取消订阅,事件发布者就会保留该委托

例如,生成一个子表单,表单订阅表单上的Click button事件

button1.Click += new EventHandler(Form_Click_Handler);
现在button对象将保留表单引用。。当表单关闭/释放/设置为空时,不再需要表单和按钮;内存被回收

当您有一个全局结构或对象具有更大的生命周期时,就会出现问题。假设应用程序对象维护打开的子窗口列表。因此,无论何时创建子表单,应用程序对象都会订阅表单事件,以便能够对其进行跟踪。在这种情况下,即使表单被关闭/释放,应用程序对象也会使其保持活动状态(非垃圾对象持有对表单的引用),并且不允许回收其内存。当你不断创建和关闭窗口时,你的应用程序占用了越来越多的内存,从而导致了漏洞。因此,您需要显式取消订阅以从应用程序中删除表单引用

childForm.Event -= new EventHandler(Form_Handler)

因此建议您使用一个unsubscribe块(-=)来补充订阅例程(+=)。。。但是,在库存情况下,您可以不使用它。

我认为没有为VB用户量身定制的漏洞。。女士对每个人都一视同仁:)