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?
ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);
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.
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. :-)
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