2010-05-20 9 views
5

¿Alguien tiene algún inconveniente? Cabe señalar que no se pueden eliminar métodos anónimos de una lista de delegados de eventos, soy consciente de eso (en realidad esa fue la motivación conceptual para esto).C# Events and Lambdas, alternative to null check?

El objetivo aquí es una alternativa a:

if (onFoo != null) onFoo.Invoke(this, null); 

Y el código:

public delegate void FooDelegate(object sender, EventArgs e); 

public class EventTest 
{ 
    public EventTest() 
    { 
     onFoo += (p,q) => { }; 
    } 

    public FireFoo() 
    { 
     onFoo.Invoke(this, null); 
    } 

    public event FooDelegate onFoo; 

}

+0

Bueno, que me pidió no preguntar, así que planteo. –

+0

No vienen a la mente inconvenientes importantes. No se me ocurren ventajas, tampoco. – Jay

Respuesta

3
public event FooDelegate onFoo = delegate {}; 
+0

No estoy seguro de lo que estás tratando de decir. Quizás "delegate (p, q) {};"? El delegado toma dos parámetros. – Sprague

+0

con esta inicialización de evento puede disparar evento sin verificación de nulo. No, solo delegue {}. – Nagg

+0

votaré esta respuesta si funciona, probándola mañana por la mañana. – Sprague

5

Una alternativa es hacer un método de extensión en su lugar:

public static class EventExtensions { 
    public static void Fire<T>(this EventHandler<EventArgs<T>> handler, object sender, T args) { 
     if (handler != null) 
      handler(sender, new EventArgs<T>(args)); 
    } 
} 

Ahora es jus t:

TimeExpired.Fire(this, new EventArgs()); 
0

Las últimas versiones de Visual Studio automáticamente aconseja la utilización de un null-conditional operator:

onFoo?.Invoke(this, null); 

(siempre que se encuentre este tipo de código: if (onFoo != null) onFoo.Invoke(this, null)).

Este operador llegó a estar disponible con el lanzamiento de C# 6.0 en 2015.