estoy seguro de que estoy simplemente no entender algo fundamental acerca de eventos y/o delegados en C#, pero por qué no puedo hacer las pruebas de Boole en este ejemplo de código:En C#, ¿por qué no puedo probar si un controlador de eventos es nulo en algún lugar fuera de la clase que está definida?
public class UseSomeEventBase {
public delegate void SomeEventHandler(object sender, EventArgs e);
public event SomeEventHandler SomeEvent;
protected void OnSomeEvent(EventArgs e) {
// CANONICAL WAY TO TEST EVENT. OF COURSE, THIS WORKS.
if (SomeEvent != null) SomeEvent(this, e);
}
}
public class UseSomeEvent : UseSomeEventBase {
public bool IsSomeEventHandlerNull() {
// "LEFT HAND SIDE" COMPILER ERROR
return SomeEvent == null;
}
}
class Program {
static void Main(string[] args) {
var useSomeEvent = new UseSomeEvent();
useSomeEvent.SomeEvent +=new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEvent.SomeEvent == null) {
}
var useSomeEventBase = new UseSomeEventBase();
useSomeEventBase.SomeEvent += new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEventBase.SomeEvent == null) {
}
}
static void FuncToHandle(object sender, EventArgs e) { }
}
+1 para la respuesta. Solo para agregarlo, puede, por supuesto, implementar las operaciones de agregar/eliminar como métodos explícitos con un delegado de multidifusión internamente. En ese caso, puede rastrear suscriptores y no suscriptores usted mismo, y así proporcionar acceso a información adicional (por ejemplo, recuento de suscriptores, etc.) si así lo desea. – LBushkin
Sí, lo agregaré, gracias. –
Podría ser útil tener en cuenta que los eventos * reason * se implementan de esta forma para que cualquier clase no pueda cambiar el comportamiento de la clase con el evento simplemente accediendo al evento (como una propiedad de delegado) y borrando su lista de suscriptores – womp