【发布时间】:2010-01-18 11:02:18
【问题描述】:
【问题讨论】:
标签: vb.net handles addhandler
【问题讨论】:
标签: vb.net handles addhandler
在附加事件处理程序的确切时间以及周围发生的事情方面存在一些差异。例如,当使用WithEvents 和Handles 时,编译器将发出代码来包装对持有实例的变量的访问,该实例在属性中公开事件,并且在属性设置器中它将事件处理程序与前一个实例分离(如果有),然后将事件处理程序附加到新实例(如果有)。
这意味着,如果您采用以下代码示例,对mm 的访问将表现不同:
' WithEvents approach '
Dim WithEvents mm As SomeClass
Sub Main()
mm = New SomeClass()
Dim nn As SomeClass = mm
End Sub
' Other approach '
Dim mm As SomeClass
Sub Main()
mm = New SomeClass()
Dim nn As SomeClass = mm
End Sub
在WithEvents 的情况下,mm = New SomeClass() 实际上会调用属性设置器,Dim nn As SomeClass = mm 将从属性获取器中获取值,而在第二种情况下,不会为该值创建任何属性,但代码将直接访问该字段。
【讨论】:
WithEvents 提高可读性可能会引起争议,但总的来说我认为你是对的。 WithEvents 还具有在将字段设置为 Nothing 时分离事件处理程序的机制,这很好(如果您未能分离事件处理程序,它们将阻止对象被垃圾收集)。
mm = otherInstanceOfSomeClass,新的 mm 是否会跟随事件?
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'this
AddHandler Button2.Click, AddressOf Button2_Click
'now Button2_Click looks like this
'Private Sub Button2_Click(ByVal sender As System.Object, _
'ByVal e As System.EventArgs) Handles Button2.Click
End Sub
【讨论】: