2010-01-18 55 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

相關問題