8
votes

Syntaxe de suppression de l'événement C #

Je suis confondu par la syntaxe pour supprimer les gestionnaires d'événements en C #.

Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove


4 commentaires

Le retrait d'un objet recherche la liste des délégués d'un objet correspondant à la cible et à la méthode de l'objet donné et supprime cela.


Vous n'avez pas à utiliser de nouveau Myhandler, c'est juste une enveloppe pour un délégué.


Réponses à ce fil: Stackoverflow.com/questions/1178725/how-a-unset-event avoir une discussion sur le sujet aussi.


Un autre thread étroitement lié Stackoverflow.com/Questtions/99790/...


3 Réponses :


-1
votes

Vous pouvez penser aux événements en tant que méthodes d'espace réservé pour la logique déléguée qui s'exécute lorsque l'événement est soulevé. Un seul événement peut avoir plusieurs abonnés (multi-moulages), de sorte que la syntaxe + = = et - = est la manière dont un seul gestionnaire d'événements est attaché ou supprimé. Tout simplement faire la mission réinitialiserait les abonnements de l'événement, ce qui pourrait provoquer des effets secondaires indésirables.

Edit: Ce lien explique davantage sur l'événement en C #


3 commentaires

Pourquoi le vote en bas? Cela semble être une réponse parfaitement valide.


Redémarrez la question de l'OP: "Pourquoi nous pouvons + = un objet nouveau et - = un objet neuf entièrement différent et obtenez l'effet souhaité?" Josh E ne répond pas Pourquoi Nous pouvons attacher "A" et supprimer "B" où "A" et "B" sont des cas différents et obtenez toujours ce que nous voulons.


J'avais pensé qu'en parlant de souscription, j'ai couvert cela. La réponse de Charles Bretana couvre cela bien, donc je vais m'abstenir d'éditer ma réponse



19
votes

Le + = = et les - = sont des raccourcis de syntaxe pour des méthodes internes intégrées nommées Ajouter () et Supprimer (), qui ajoutent ou supprimez un pointeur sur une liste liée interne des délégués que le délégué a le cadre privé . Lorsque vous exécutez Supprimer, il commence à la tête de la liste liée et examine chaque délégué dans la liste une à la fois jusqu'à ce qu'il en trouve un «égal» à celui que vous avez transmis à la méthode Suppr (). (en utilisant - = syntaxe)

Ensuite, il supprime celui-ci de la liste liée et corrigez la liste liée pour conserver sa connectivité ...

Dans ce contexte, la méthode 'Equals' (pour un délégué ()) est remplacée afin qu'elle compare seulement la cible du délégué et la méthodpatr, qui sera la même même si vous avez créé un nouveau délégué à Passez pour enlever ...


0 commentaires

7
votes

Le "nouveau Myhandler" est réellement redondant. Vous pouvez simplement faire

Something += HandleSomething; // add
Something -= HandleSomething; // remove


4 commentaires

C'est en fait la même chose que l'exemple fourni, bien que le plus récent C # ajoute que pour vous.


Vous pouvez laisser la nouvelle sortie, mais si vous laissez Visual Studio le remplir pour vous en tapant: "quelque chose + =" alors , le code Autogenerated le complétera similaire à celui-ci: "Quelque chose + = nouveau myhandler ( Poignée); " L'OP demande à ce qui se passe sous le capot afin que la nouvelle façon fonctionne.


Ouais, j'ai fini par être appelé et n'avais pas assez de temps pour une réponse complète. Les deux syntaxes sont équivalentes, le compilateur déduit le délégué et ajoute une nouvelle instance à la liste de multidiffusion. Même en élimination, la syntaxe "nouvelle EventHandlerler ()" fonctionne car elle examine la signature de la cible et de la méthode et non un objet spécifique réf.


Bien que ce raccourci de syntaxe fait la même chose que le raccourci de syntaxe d'origine, au moins celui-ci a du bon sens. Cela peut être utilisé sans faire de la confusion. J'aime beaucoup mieux cette nouvelle syntaxe.