L'appel d'un gestionnaire d'événements en C#
J'ai essayé d'apprendre à utiliser les gestionnaires d'événements en C# mais je ne peux pas comprendre ce gestionnaire(e) dans le code suivant:
public event EventHandler ThresholdReached;
protected virtual void OnThresholdReached(EventArgs e)
{
EventHandler handler = ThresholdReached;
if (handler != null)
{
handler(this, e);
}
}
Est-il en essayant d'appeler la méthode de gestionnaire d'événements (ce) avec l'événement (e)?
Connexes: stackoverflow.com/q/2448487
OriginalL'auteur Tony | 2012-08-31
Vous devez vous connecter pour publier un commentaire.
Il appelle tous enregistré des écouteurs d'événements qui sont enregistrés sur le
ThresholdReached
événement.La
handler != null
vérification permet de s'assurer au moins un écouteur est inscrit à cet événement.En C# 6.0 et au-dessus, vous pouvez utiliser Null Propagation:
handler(this, e)
va appeler tous les inscrits de l'écouteur d'événement. Des écouteurs d'événements, abonnez-vous, avec l'aide de la+=
de l'opérateur et de se désabonner d'-=
opérateur à cet événement.this
est là pour donner de l'écouteur d'événement pour savoir qui a soulevé la ThresholdReached événement. Qui était l'expéditeur de l'événement.e
est le cas de l'argument qui est également passé dans la méthode écouteur qui peuvent contenir plus d'informations utiles sur la ThresholdReached cas par exemple qui seuil a été atteint.Avec l'opérateur+=. Comme dans l'autre classe yourInstanceWithTheEvent.ThresholdReached += SomeThresholdReachedHandler;
OriginalL'auteur BlueM
C'est élever un
ThresholdReached
événement avec des arguments de l'expéditeur=ce et eventarguments = e.En fait, c'est le même que le suivant;
S'il y a des auditeurs de cet événement; il sera tout simplement appeler auditeur délégués;
Puis, lorsque cet événement est déclenché
Form1_ThresholdReached
fonction sera appelée avecthis
ete
paramètres.pouvez-vous expliquer?
Imaginez ce qui arriverait si le dernier auditeur se désinscrit après la != null vérifier.
ne pas le "gestionnaire" et le "ThresholdReached" point à la même référence? Désolé si je suis absent un certain point.
Pas de. La liste d'invocation est copié pour la
handler
de référence. Voir ce post par Eric Lippert sur le sujet.OriginalL'auteur daryal
Le code dans votre exemple des copies de tous les gestionnaires inscrits à la variable locale
handler
, vérifie que l'invocation de la liste n'est pas vide et appelle tous les membres de la copie d'invocation liste avec les argumentsthis
ete
.La raison pour le fait que vous obtenez un cliché de l'invocation de la liste, c'est que les délégués sont immuables. Vous obtenez une référence à l'actuel délégué multicast, et lorsque les gestionnaires sont ajoutés ou supprimés de la sauvegarde de domaine pointe vers un nouveau délégué créé à partir de deux immuable.
La raison habituelle pour copier la liste d'invocation d'une variable locale est une certaine forme de fil-sécurité: un gestionnaire pourrait être désabonné entre l'habituel nullité check (vérifier que l'invocation de la liste n'est pas vide) et le réel de l'invocation: de cette façon, vous pourriez accidentellement le feu à un événement sans gestionnaire et un
NullReferenceException
serait jeté.OriginalL'auteur DoomMuffins
handler
se réfère à votreThresholdReached
événement. Donc, si quelqu'un s'abonne àThresholdReached
événements, leurs régimes enregistrés gestionnaire sera appelée avec des argumentsthis
ete
.OriginalL'auteur ekholm
C'est le Déclenchement de la
ThresholdReached
événement. Passer une référence à lui-même,this
. Le passage d'arguments à propos de l'événement danse
.OriginalL'auteur burnttoast11
Non, pas littéralement. Il est d'appeler le gestionnaire d'événements avec le
EventArgs
e et à l'aide dethis
comme expéditeur. Il pourrait aussi bien être:Ou, pour contourner le null check:
Mais, comme @Oded a noté, le premier morceau n'est pas thread-safe, parce que
EventHandler handler = ThresholdReached
crée une copie du gestionnaire, ce qui est mieux expliqué dans cette question.OriginalL'auteur CodeCaster
L'appel au gestionnaire d'représente un appel de fonction dans un autre objet ou de la classe. Lorsque vous créez l'objet, vous serez capable d'écrire un morceau de code qui ressemble à ceci:
someFunction
dans cette classe sera définie comme cela
OnThreasholdReached
fonction dans l'objet d'origine est ce que publie l'événement pour toute autre classe qui a assigné une fonction à la ThreasholdReached gestionnaire. À l'aide dehandler
comme un go-between est totalement inutile étape supplémentaire. Vous êtes toujours en disantif ThreasholdReached != null
, c'est la même chose.En Résumé: La ligne de code
handler(this, e)
est en fait l'appel à tout abonnésomeFunction(object sender, EventArgs e)
a été attribué à l'ThreasholdReached événement de l'objet.OriginalL'auteur Nevyn