2009-08-28 20 views
20

Je suis tombé sur cette question dans un test de pratique Microsoft et j'ai été confus. Voici la question:Élever un événement en C#

Lequel des exemples de code C# suivant est la bonne façon de déclencher un événement, en supposant que l'événement d'alarme, la AlarmEventArgs classe, et le délégué AlarmEventHandler ont été déclarés?

Voici la réponse « correcte » ils ont fourni:

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
AlarmEventHandler handler = Alarm; 
if (handler != null) 
{ 
    handler(this, e); 
} 

Cependant, il y a aussi une autre réponse qui semble correcte.

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
if (Alarm!= null) 
{ 
    Alarm (this, e); 
} 

Personnellement, utilisez toujours la deuxième méthode. Cela fonctionne très bien. Quelqu'un peut-il me dire pourquoi je devrais utiliser la première méthode au lieu de la seconde?

+2

duplication possible de [Vérification de null avant l'envoi de l'événement ... thread sécurisé?] (Http://stackoverflow.com/questions/282653/checking-for-null-before-event-dispatching-thread-safe) – doppelgreener

Répondre

15

J'ai posé une question similaire. La réponse acceptée est une bonne explication.

Checking for null before event dispatching... thread safe?

+0

La méthode du délégué anonyme proposée par l'utilisateur 'Cherian' est juste belle. Le gagnant est le gagnant :) –

+0

Une fois que vous aurez compris le concept quelque peu fonctionnel que les manutentionnaires vides sont d'accord – spender

7

Dans un environnement multi-thread, il est possible que le gestionnaire d'événements peut être mis à jour pendant que votre événement est en cours d'expédition. Pour éviter ce scénario, vous affectez le gestionnaire à une variable locale avant de rechercher null et d'envoyer le message.