2010-01-18 5 views

Répondre

3

Il existe une différence dans le moment exact auquel le gestionnaire d'événements est attaché et ce qui se passe autour. Par exemple, en utilisant WithEvents et Handles, le compilateur émettra du code qui encapsule l'accès à la variable contenant l'instance qui expose l'événement dans une propriété, et à l'intérieur du setter de la propriété, il détachera le gestionnaire d'événements de l'instance précédente (le cas échéant) , puis attachez le gestionnaire d'événements à la nouvelle instance (le cas échéant).

Cela signifie que si vous prenez les exemples de code suivant, l'accès à mm se comportera différemment:

' 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 

Dans le WithEvents cas, mm = New SomeClass() sera en fait appel à un poseur de propriété et Dim nn As SomeClass = mm va chercher la valeur d'un getter de propriété, alors que dans le second cas, il n'y aura pas de propriété créée pour la valeur, mais le code accédera directement au champ.

+0

en d'autres termes, en utilisant ** AddHanlder ** est optimal pour le, disons, * ressources * et la vitesse, et ** WithEvents ** pour le code * lisibilité *? .. – serhio

+0

Et qu'en détachant le gestionnaire d'événements quand l'objet n'a plus de références à celui-ci? – serhio

+1

@serhio: Je pense que la lisibilité accrue de l'utilisation de 'WithEvents' peut être discutée, mais en général je pense que vous avez raison. 'WithEvents' a aussi le mécanisme de détacher les gestionnaires d'événements quand vous définissez le champ' Nothing', ce qui est sympa (si vous ne détachez pas les gestionnaires d'événements, ils empêcheront l'objet d'être récupéré). –

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

peut-être. Vous avez seulement oublié le comportement du distracteur, où Handles supprimera également le gestionnaire du bouton. – serhio

Questions connexes