2010-04-06 7 views
11

J'ai examine un de mes C# livres et je viens de voir une phrase sur les événements en C#:
  Le but principal des événements est d'empêcher les abonnés d'interférer les uns avec les autres.Le But principal des événements en C#

Quoi qu'il en soit, oui, les événements fonctionnent comme des délégués.
Je me demandais pourquoi je devrais utiliser des événements au lieu de délégués.

Alors, y a-t-il quelqu'un qui peut expliquer la partie en gras?

Merci d'avance.

Répondre

15

Le choix ne serait pas vraiment entre un délégué et un événement - ce sont des choses complètement différentes. Vous pouvez toutefois exposer une propriété publique ou un champ public ayant un type de délégué. Je suppose que c'est ce que vous voulez vraiment dire. Supposons que Button.Click était un champ ou une propriété publique au lieu d'un événement. Un morceau de code pourrait alors souscrire à un événement, et une autre pourrait alors écrire:

// Invalid with events, valid with properties 
button.Click = null; 

effaçant ainsi le gestionnaire d'événements d'origine. De même autre code serait également en mesure de Invoke les gestionnaires d'événements:

// Invalid with events, valid with properties 
button.Click(this, EventArgs.Empty); 

même si le bouton n'a pas été cliqué. Ceci est clairement une violation de l'encapsulation. La seule raison d'exposer Click à un autre code est de leur permettre d'enregistrer un intérêt dans les clics sur les boutons et d'enregistrer un désintérêt plus tard - et ce sont exactement les capacités que les événements fournissent. Pensez aux événements comme du sucre syntaxique autour de deux méthodes. Par exemple, si nous ne disposions pas d'événements alors Button aurait probablement:

public void AddClickHandler(EventHandler handler) 
public void RemoveClickHandler(EventHandler handler) 

La violation de l'encapsulation va, mais vous perdez une partie de la commodité - et tout le monde doit écrire leurs propres méthodes de ce genre. Les événements simplifient ce modèle, fondamentalement.

9

Un événement ne peut être appelé que par la classe qui le définit, alors qu'un délégué peut être appelé à partir de quiconque y a accès. Voici ce que je crois que le texte en gras signifie.

En outre, un événement peut être défini dans une interface, alors qu'un délégué ne peut pas (comme vous le déclareriez comme champ).

Je recommande de donner this link une lecture, car elle l'explique assez bien et a quelques autres exemples autres que ceux mentionnés ci-dessus.

+0

Vous pouvez déclarer le délégué comme une propriété, bien sûr. Ce serait une analogie plus appropriée. –

+0

Je viens de jeter un coup d'oeil à cet article - je n'y tiens pas tellement car cela donne l'impression que les événements sont simplement des champs de type délégué. Il n'y a rien à dire qu'un événement doit être soutenu par un champ de ce type * du tout *.Ils ressemblent plus à des propriétés qu'à des champs. –

+0

@Jon - Juste, peut comprendre cela. –

3

Vous pouvez définir un délégué sur NULL, ce qui l'amène à 'oublier' toutes les fonctions auxquelles il est abonné.

0

Vous pouvez ajouter autant de Eventhandler à votre événement que vous le souhaitez.

+2

Les délégués sont également en multidiffusion. En effet, un événement est généralement soutenu par un seul champ du type délégué approprié. –

+0

Je pense que c'est en fait un mythe assez commun que les délégués sont mono-casting. Beaucoup de développeurs C# que je connais pensent que la principale différence entre les deux est que les délégués sont mono-cast alors que les événements sont multi-cast, mais ce n'est pas le cas! –

+0

Merci pour l'info. C'est vraiment nouveau pour moi: /! – chriszero

Questions connexes