2010-02-24 44 views
1

是否需要设置为Nothing(在Dispose()中)所有WithEvents字段?Nothing,WithEvents字段和内存泄漏

显然Handles关键字将处理程序添加到这些字段,但不删除它,直到此字段不是Nothing,这可能会产生内存泄漏?!。

这应该是特别实际的情况下,像

class Foo 
{ 
    Private WithEvents _bar as Bar 

    Public Sub New(ByVal bar as Bar) 
     _bar = bar 
    End Sub 

    Private Sub Bar_Changed(ByVal sender as Object, _ 
     ByVal e as EventArgs) Handles _bar.Changed 
    '... ' 
    End Sub 
} 

回答

3

这可以产生内存泄漏,如果要您订阅对象的生活比用户更长时间。在大多数情况下,这不是事实。

以WinForms为例。通常,您会在WinForm应用程序的控件中看到WithEvents修饰符。外层Form类订阅并响应这些事件。这不会导致内存泄漏,但因为您订购的产品Control实例的寿命与订购者的寿命大致相同,所以它们的寿命为Form

如果生命期确实不同,那么将字段设置为Nothing将导致您取消订阅该事件并防止可能的内存泄漏。