2010-01-18 98 views

回答

3

事件处理程序连接时的确切区别,以及它周围发生了什么。例如,当使用WithEventsHandles时,编译器将发出代码,该代码包含对包含公开事件的实例的变量的访问,并且在属性设置器中,它将从先前实例中分离事件处理程序(如果有的话) ,然后将事件处理程序附加到新实例(如果有)。

这意味着,如果你把下面的代码样本中,获得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()实际上将调用属性setter,并Dim nn As SomeClass = mm将获取的价值来自属性获取器,而在第二种情况下,将不会为该值创建属性,但代码将直接访问该字段。

+0

换句话说,使用** ** AddHanlder是最优的,比方说,*资源*和速度,** ** WITHEVENTS的代码*可读性*?.. – serhio 2010-01-18 11:38:10

+0

而有关分离什么事件处理程序什么时候对象没有更多的引用呢? – serhio 2010-01-18 11:43:51

+1

@serhio:我认为增加使用'WithEvents'的可读性可能会引起争议,但总的来说,我认为你是对的。 'WithEvents'还具有在将字段设置为'Nothing'时分离事件处理程序的机制,这很好(如果您未能分离事件处理程序,则会阻止对象被垃圾收集)。 – 2010-01-18 11:44:54

0
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 
+2

。你只会忘记分解器的行为,Handles也会从按钮中移除处理器。 – serhio 2010-01-18 23:56:22

相关问题