web-dev-qa-db-fra.com

C # suppression d'un gestionnaire d'événements

Je fais cela depuis un moment, mais je n'ai pas remarqué que j'utilise un new chaque fois que je supprime un gestionnaire d'événements. Suis-je censé créer un nouvel objet?

Existe-t-il essentiellement une différence entre 1 et 2?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: D'accord, c'est un double. Désolé pour ça. Réponse publiée ici .

Deux délégués du même type avec les mêmes cibles, méthodes et listes d'invocation sont considérés comme égaux.

26
Sharun

Il n'y a pas de différence entre 1 et 2, car 2 est le sucre syntaxique pour 1. Ce n'est que si 2 fait référence à un champ d'instance délégué au niveau de la classe plutôt qu'au nom de la méthode réelle qu'il y aura une différence dans l'IL compilé.

En termes de ce qui se passe à l'exécution, la méthode event Remove ne semble pas se soucier de savoir si l'instance déléguée qui lui a été transmise est la même que celle transmise à la méthode Add. Je ne me souviens pas directement pourquoi c'est, mais je suppose que les instances déléguées sont toujours internées.

EDIT: Jon Skeet dit que la méthode event Remove utilise l'égalité des valeurs (Delegate.Equals) pour déterminer quel délégué supprimer de la liste, plutôt que l'internement + l'égalité de référence. Même résultat final, méthode différente. :-)

29
Christian Hayter

La deuxième version est équivalente à la première; il utilise simplement une syntaxe plus courte. Cela a été implémenté en C # 2.0

13
Adam Maras