[C#] Comprobando nulo antes de enviar el evento ... ¿está seguro?


Answers

La forma más sencilla de eliminar esta comprobación nula es asignar el manejador de eventos a un delegado anónimo. La multa incurrida en muy poco y lo libera de todos los controles nulos, condiciones de carrera, etc.

public event EventHandler SomeEvent = delegate {};

Pregunta relacionada: ¿Hay algún inconveniente en agregar un delegado vacío anónimo en una declaración de evento?

Question

Algo que me confunde, pero que nunca ha causado ningún problema ... la forma recomendada de enviar un evento es la siguiente:

public event EventHandler SomeEvent;
...
{
    ....
    if(SomeEvent!=null)SomeEvent();
}

En un entorno de subprocesos múltiples, ¿cómo garantiza este código que otro subproceso no alterará la lista de invocación de SomeEvent entre la comprobación de nulo y la invocación del evento?




Me gustaría sugerir una ligera mejora en la respuesta de RoadWarrior al utilizar una función de extensión para EventHandler:

public static class Extensions
{
    public static void Raise(this EventHandler e, object sender, EventArgs args = null)
    {
        var e1 = e;

        if (e1 != null)
        {
            if (args == null)
                args = new EventArgs();

            e1(sender, args);
        }                
    }
  }

Con esta extensión en el alcance, los eventos se pueden plantear simplemente por:

clase SomeClass {evento público EventHandler MyEvent;

void SomeFunction()
{
    // code ...

    //---------------------------
    MyEvent.Raise(this);
    //---------------------------
}

}

c # eventos




La forma recomendada es un poco diferente y utiliza un temporal de la siguiente manera:

EventHandler tmpEvent = SomeEvent;
if (tmpEvent != null)
{
    tmpEvent();
}