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
3 Réponses :
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. P>
Edit: Ce lien explique davantage sur l'événement en C # P>
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 I> 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
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) p>
Ensuite, il supprime celui-ci de la liste liée et corrigez la liste liée pour conserver sa connectivité ... p>
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 ... P>
Le "nouveau Myhandler" est réellement redondant. Vous pouvez simplement faire
Something += HandleSomething; // add Something -= HandleSomething; // remove
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
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.
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/...