Je ne comprends pas pourquoi nous avons besoin du mot-clé "event" lors de la définition des événements, alors que nous pouvons faire la même chose sans utiliser le mot-clé "event", simplement en utilisant les délégués.
par exemple
public delegate void CustomEventHandler(int a, string b);
public event CustomEventHandler customEvent;
customEvent += new CustomEventHandler(customEventHandler);
customEvent(1,"a"); // Raising the event
Ici, si je supprime le mot-clé "event" de la deuxième ligne, je peux également déclencher l'événement en appelant le délégué. Quelqu'un peut-il me dire pourquoi ce mot clé d'événement est-il nécessaire?
Réponses:
Les événements de type champ et les champs publics des types de délégués se ressemblent, mais sont en fait très différents.
Un événement est fondamentalement comme une propriété - c'est une paire de méthodes d'ajout / suppression (au lieu du get / set d'une propriété). Lorsque vous déclarez un événement de type champ (c'est-à-dire un événement où vous ne spécifiez pas vous-même les bits d'ajout / de suppression), un événement public est créé et un champ de sauvegarde privé. Cela vous permet de déclencher l'événement en privé, mais d'autoriser l'abonnement public. Avec un champ de délégué public, n'importe qui peut supprimer les gestionnaires d'événements d'autres personnes, déclencher l'événement lui-même, etc. - c'est un désastre d'encapsulation.
Pour en savoir plus sur les événements (et les délégués), lisez mon article sur ce sujet . (À un moment donné, je dois mettre à jour cela pour C # 4, ce qui change très légèrement les événements de type champ. L'essentiel est toujours correct.)
la source
Le mot-clé événement fait 3 choses différentes:
=
et()
(affectation et appel) en private, de sorte que seule la classe contenant peut invoquer l'événement ou remplacer toutes les méthodes qu'il contient. Les opérateurs-=
et+=
peuvent toujours être appelés sur un événement depuis l'extérieur de la classe qui le définit (ils obtiennent le modificateur d'accès que vous avez écrit à côté de l'événement).-=
et vous+=
comporter lors d'événements.la source
Les autres réponses sont très bien; Je voudrais juste ajouter quelque chose à quoi réfléchir.
Votre question est "pourquoi avons-nous besoin d'événements lorsque nous avons des champs de type délégué?" Je voudrais étendre cette question: pourquoi avez-vous besoin de méthodes, de propriétés, d'événements, de constructeurs d'instances ou de finaliseurs si vous avez des champs de type délégué? Pourquoi avez-vous besoin d' autre chose que des champs contenant des valeurs et des délégués dans un type? Pourquoi ne pas simplement dire
?
Vous n'avez pas besoin de méthodes, de propriétés ou d'événements. Nous vous donnons cela parce que les modèles de conception de méthode, de propriété et d'événement sont importants et utiles, et méritent d'avoir une manière standard, documentée et claire de les implémenter dans le langage.
la source
C'est en partie nécessaire car si vous omettez le
event
mot - clé, cela rompt l'encapsulation. S'il ne s'agit que d'un délégué de multidiffusion public, n'importe qui peut l'invoquer, le définir sur null ou le falsifier. Si une classe appeléeMailNotifier
existe et qu'elle a un événement appeléMailReceived
, cela n'a aucun sens pour les autres types de pouvoir déclencher cet événement via l'appelmailNotifier.MailReceived()
;D'un autre côté, vous ne pouvez manipuler et invoquer des événements «comme un champ» que du type qui l'a défini.
Si vous voulez garder votre invocation d'événement privée, rien ne vous empêche de faire quelque chose comme ceci:
... mais c'est tout un tas de code juste pour (plus ou moins) faire ce que les événements de type champ nous donnent déjà.
la source
Les événements présentent des avantages distincts par rapport aux champs délégués. Les événements peuvent être définis dans les interfaces contrairement aux champs, en ajoutant une abstraction au code, et plus important encore: les événements ne peuvent être appelés qu'à l'intérieur de la classe de définition. Dans votre cas, n'importe qui pourrait appeler l'événement, détruisant éventuellement votre code.
Consultez ce billet de blog pour plus d'informations.
la source
délégué est un type de référence. Il hérite de MulticastDelegate . l'événement est un modificateur. un événementest un modificateur spécial pour le délégué. Il modifie certaines fonctions / méthodes d'accessibilité, par exemple la méthode Invoke. Après avoir été modifiée par un événement de modificateur, une instance de délégué devient un nouveau concept «Événement». Donc, Event n'est qu'un délégué modifié. Vous ne pouvez pas modifier directement la référence ou appeler un événement en dehors de la classe dans laquelle l'événement a été défini, mais vous pouvez modifier la référence ou appeler une instance de délégué normale. L'événement fournit une protection supplémentaire, de sorte que l'événement ait plus de fonctionnalités de sécurité. Lorsque vous êtes en dehors de la classe où l'événement a été défini, vous êtes autorisé à effectuer deux types d'opérations sur l'événement, "+ =" et "- =". Mais vous pouvez accéder à tous les champs publics, propriétés, méthodes, etc. d'une instance de délégué normale. Voici un exemple:
la source