Question

Je suis confus par la syntaxe pour la suppression des gestionnaires d'événements en C #.

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

Le « nouveau » crée un nouvel objet sur chaque ligne, de sorte que vous ajoutez un objet puis lui demander de supprimer un objet différent.

Qu'est-ce qui se passe vraiment sous les couvertures que cela peut fonctionner?
Il est sûr pas évident de la syntaxe.

Était-ce utile?

La solution

Le + = et - = sont des raccourcis syntaxe intégrée dans les méthodes internes nommé Ajouter () et remove (), qui ajouter ou supprimer un pointeur sur une liste chaînée interne des délégués que le délégué a comme un champ privé . Lorsque vous exécutez Supprimer, il commence à la tête de la liste, et examine chaque délégué dans la liste un à la fois jusqu'à ce qu'il en trouve un qui est « égal » à celui que vous avez passé à la méthode remove (). (En utilisant - = syntaxe)

Ensuite, il supprime que l'on de la liste chaînée, et les correctifs de la liste liée à retenir est la connectivité ...

Dans ce contexte, la méthode « égal » (pour un délégué ()) est neutralisé, de sorte qu'il ne compare que la cible du délégué, et le methodPtr, qui sera le même, même si vous avez créé un nouveau délégué passer pour supprimer ...

Autres conseils

La « nouvelle MyHandler » est en fait double emploi. Vous pouvez simplement faire

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

Tous les événements en C # sont délégués multicast, donc le + = et - = syntaxe indique que vous ajoutez / la suppression d'un délégué à la liste des délégués qui seront appelés

.

En ce qui concerne ce qui se passe dans les coulisses, est la meilleure explication que j'ai trouvé de Jon Skeet.

Vous pouvez penser à des événements comme les méthodes d'espace réservé pour la logique délégué qui exécute lorsque l'événement est déclenché. Un événement unique peut avoir plusieurs abonnés (multi-casting), de sorte que le + = et - = syntaxe est la façon dont un seul gestionnaire d'événement est fixé ou enlevé. Il suffit de faire cession réinitialisait les abonnements de l'événement, ce qui pourrait provoquer des effets secondaires indésirables.

EDIT: ce lien explique plus sur le concours complet en C #

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top