使用AddHandler
方法,如果我从不使用RemoveHandler
,是否会在某些情况和情况下导致内存泄漏?我不太确定这个的真相。
还有其他原因导致内存泄漏只能在VB中使用而不是C#?
答案 0 :(得分:11)
通常它不会......但存在可能性。
当您订阅一个事件时,您基本上会向您的方法提供一个委托(如果您愿意将func指针)给事件发布者,只要您不使用 - =运算符取消订阅,该事件发布者就会保留该事件。
例如,假设您生成子表单并且表单订阅表单上的Click按钮事件。
button1.Click += new EventHandler(Form_Click_Handler);
现在按钮对象将保持表单引用。当窗体关闭/处置/设置为null时,不再需要表单和按钮;记忆被回收了。
当您拥有一个具有更长生命周期的全局结构或对象时,就会出现问题。让我们说Application对象维护一个打开的子窗口列表。因此,每当创建子表单时,应用程序对象都会订阅Form事件,以便它可以对其进行标记。在这种情况下,即使表单被关闭/处理,应用程序对象也保持活动状态(非垃圾对象保持对表单的引用)并且不允许回收它的存储器。当你不断创建和关闭窗口时,你的应用程序会泄漏越来越多的内存。因此,您需要明确取消订阅以从应用程序中删除表单引用。
childForm.Event -= new EventHandler(Form_Handler)
所以建议你有一个取消订阅块( - =)补充你的订阅例程(+ =)......但是你可以在没有库存场景的情况下进行管理。
答案 1 :(得分:0)
如果对象a被绑定到对象b事件,则在收集对象a之前不会收集对象b。
事件标记计为发布者对象的引用。
是的,这也发生在C#上,我与语言无关。