2011-02-28 9 views
10

Básicamente, he visto este utiliza con demasiada frecuencia:¿Por qué asignar un controlador a un evento antes de llamarlo?

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     MyEventHandler handler = this.MyEvent; 

     if (handler != null) 
     { 
      handler(this, new MyEventArgs()); 
     } 
    } 

Cuando la misma facilidad podría hacerse así:

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     if (MyEvent != null) 
     { 
      MyEvent(this, new MyEventArgs()); 
     } 
    } 

Por lo tanto, me estoy perdiendo algo? ¿Hay alguna razón por la que las personas asignen el evento a un controlador y luego eleven el controlador en lugar del evento en sí? ¿Es solo una "mejor práctica"?

Respuesta

10

La asignación a una variable local asegura que si el evento se no registrado entre el if y la invocación real, la lista de invocación no será nulo (ya que la variable tendrá una copia de la lista de invocación original).

Esto puede suceder fácilmente en el código multiproceso, donde entre la comprobación de un valor nulo y la activación del evento puede ser no registrado por otro hilo.

Ver this SO preguntas y respuestas.

2

Seguridad para subprocesos.

¿Qué sucede si, entre el momento en que comprueba si MyEvent es nulo y activa MyEvent, aparece otro hilo y cancela la suscripción al evento?

Cuestiones relacionadas