I understood that Handles
is only one way to add in constructor the AddHandler
, mais en général, ces deux sont-ils équivalents?AddHandler vs. Handles - quelle est la différence?
Répondre
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.
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
peut-être. Vous avez seulement oublié le comportement du distracteur, où Handles supprimera également le gestionnaire du bouton. – serhio
en d'autres termes, en utilisant ** AddHanlder ** est optimal pour le, disons, * ressources * et la vitesse, et ** WithEvents ** pour le code * lisibilité *? .. – serhio
Et qu'en détachant le gestionnaire d'événements quand l'objet n'a plus de références à celui-ci? – serhio
@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é). –