mayor parte del código que he visto utiliza la siguiente manera de declarar e invocar evento de disparo:¿Es esta una mejor forma de activar/invocar eventos sin una comprobación nula en C#?
public class MyExample
{
public event Action MyEvent; // could be an event EventHandler<EventArgs>, too
private void OnMyEvent()
{
var handler = this.MyEvent; // copy before access (to aviod race cond.)
if (handler != null)
{
handler();
}
}
public void DoSomeThingsAndFireEvent()
{
// ... doing some things here
OnMyEvent();
}
}
Incluso ReSharper genera un método de invocación de la manera mencionada anteriormente.
¿Por qué no hacerlo de esta manera:
public class MyExample
{
public event Action MyEvent = delegate {}; // init here, so it's never null
public void DoSomeThingsAndFireEvent()
{
// ... doing some things here
OnMyEvent(); // save to call directly because this can't be null
}
}
¿Puede alguien explicar por qué no una razón para hacer esto? (pro vs. contras)
Escuché que Jon Skeet lo hace en ambos sentidos ... –
Creo que en la mayoría de los casos no es importante llamar la atención si hay al menos un oyente "real" conectado ... como se ve arriba, ya existe una verificación nula si se usa de la manera "normal". – Beachwalker
posible duplicado de [¿Hay alguna desventaja al agregar un delegado vacío anónimo en la declaración de evento?] (Http://stackoverflow.com/questions/170907/is-there-a-downside-to-adding-an-anonymous-empty -delegate-on-event-declaration) – CodesInChaos