2010-02-17 11 views
6

Stavo passando in rassegna e sono imbattuto in questa domanda:gestore Metodo evento alzando convenzione

Action vs delegate event

The answer from nobug incluso questo codice:

protected virtual void OnLeave(EmployeeEventArgs e) { 
    var handler = Leave; 
    if (handler != null) 
    handler(this, e); 
} 

ReSharper genera anche codice simile quando si utilizza il "creare alzando metodo "quick-fix.

La mia domanda è, perché è questa linea occorre ?:

var handler = Leave; 

Perché è meglio che scrivere questo ?:

protected virtual void OnLeave(EmployeeEventArgs e) { 
    if (Leave != null) 
    Leave(this, e); 
} 

risposta

12

E 'meglio, perché c'è una piccola possibilità che Leave diventa nullo dopo il controllo Null, ma prima dell'invocazione (che causerebbe il lancio del codice a NullReferenceException). Poiché il tipo di delegato è immutabile, se lo assegni prima a una variabile questa possibilità scompare; la tua copia locale non sarà interessata da eventuali modifiche allo Leave dopo l'assegnazione.

Si noti tuttavia che questo approccio crea anche un problema al contrario; significa che esiste una (piccola, ma esistente) possibilità che un gestore di eventi venga richiamato dopo che è stato staccato dall'evento. Questo scenario dovrebbe naturalmente essere gestito con garbo pure.

5

In un'applicazione multithread, è possibile ottenere un'eccezione di riferimento null se il chiamante annulla la registrazione dall'evento. L'assegnazione a una variabile locale protegge da questo.

Le probabilità sono che non lo vedresti mai (fino a quando non ti fa male il peggio). Ecco un modo di vedere la cosa che mostra il problema ...

protected virtual void OnLeave(EmployeeEventArgs e) { 
    if (Leave != null) //subscriber is registered to the event 
    { 
    //Subscriber unregisters from event.... 
    Leave(this, e); //NullReferenceException! 
    } 
} 
+0

Yup. Ottenere il gestore di eventi chiamato dopo aver annullato la registrazione è una gara inspiegabile. L'NRE è facilmente risolvibile. –

Problemi correlati