2009-09-28 3 views
26

Cela fait un moment que je fais cela, mais je n'ai pas remarqué que j'utilise un new chaque fois que j'enlève un gestionnaire d'événements. Suis-je censé créer un nouvel objet?C# supprimer un gestionnaire d'événements

Fondamentalement, y a-t-il une différence entre 1 et 2?

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: Ok c'est un doublon. Désolé pour ça. Réponse here Deux délégués du même type ayant les mêmes cibles, méthodes et listes d'invocation sont considérés comme égaux.

Répondre

29

Il n'y a pas de différence entre 1 et 2, car 2 est du sucre syntaxique pour 1. Seulement si 2 se référait à un champ d'instance de délégué de classe plutôt qu'au nom de méthode réel, il y aurait une différence dans l'IL compilé.

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

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

+0

Puisqu'un délégué est juste une référence à une méthode et une instance (facultative), la comparaison de ces deux devrait être suffisant pour déterminer l'égalité. – Botz3000

+0

Oui, mais de manière générale, si vous appelez 'new T()' deux fois avec un type de référence arbitraire, vous obtiendrez deux instances différentes. Puisque cela ne semble pas être le cas pour les délégués, je déduis que le constructeur délégué est automatiquement l'internement des instances, tout comme le fait la classe 'Type'. –

+0

interné - qu'est-ce que cela signifie? Merci d'avoir répondu. Ce genre de réponses au doute que j'avais. Je me demandais à propos de ce nouveau comme je crée une nouvelle instance lorsque j'ajoute un gestionnaire et en créer un nouveau quand je l'enlève. Très étrange. – Sharun

13

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