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