Considérons les deux façons de déclarer des événements.
Soit vous déclarez un événement à l'aide d'un explicite add
/remove
méthode, ou vous déclarer un événement sans de telles méthodes.
En d'autres termes, vous déclarez l'événement comme celui-ci:
public event EventHandlerType EventName
{
add
{
// some code here
}
remove
{
// some code here
}
}
ou vous déclarer comme ceci:
public event EventHandlerType EventName;
La chose est, à certains égards, ils sont la même chose, et dans d'autres façons, ils sont complètement différents.
Du point de vue de l'extérieur de code, c'est à ... code de l'extérieur de la classe d'édition de l'événement, ils sont exactement la même chose. Pour vous abonner à un événement, vous appelez une méthode. Pour vous désabonner, vous appelez une méthode différente.
La différence est que dans le deuxième exemple de code ci-dessus, ces méthodes seront fournis par le compilateur pour vous, cependant, c'est encore la façon dont il va être. Pour vous inscrire à l'événement, vous appelez une méthode.
La syntaxe pour le faire, en C#, cependant, est le même, vous n'avez soit:
objectInstance.EventName += ...;
ou:
objectInstance.EventName -= ...;
Donc, à partir du "point de vue externe", les deux voies ne sont pas différents.
Cependant, à l'intérieur de la classe, il y a une différence.
Si vous essayez d'accéder à l' EventName
identifiant à l'intérieur de la classe, vous êtes en fait en se référant à l' field
qui sauvegarde la propriété, mais seulement si vous utilisez la syntaxe qui n'est pas explicitement déclarer add
/remove
méthode.
Un modèle typique ressemble à ceci:
public event EventHandlerType EventName;
protected void OnEventName()
{
var evt = EventName;
if (evt != null)
evt(this, EventArgs.Empty);
}
Dans ce cas, lorsque vous faites allusion à l' EventName
, vous êtes réellement en vous référant à la rubrique qui contient le délégué de type EventHandlerType
.
Toutefois, si vous avez déclaré explicitement la add
/remove
méthodes, en se référant à l' EventName
identifiant à l'intérieur de la classe sera comme à l'extérieur de la classe, car le compilateur ne peut pas garantir qu'il connaît le terrain, ou de tout autre mécanisme, dans lequel vous stockez l'abonnement.