Los siguientes dos líneas de código son casi equivalentes:
public event Action<EmployeeEventAgs> Leave;
en contraposición a:
public event EventHandler<EmployeeEventAgs> Leave;
La diferencia está en la firma del método controlador de eventos. Si se utiliza el primer acercamiento con la acción, usted podría tener:
public void LeaveHandler(EmployeeEventAgs e) { ... }
y luego esto:
obj.Leave += LeaveHandler;
Con el segundo enfoque, la firma de los LeaveHandler
tiene que ser diferente:
public void LeaveHandler(object sender, EmployeeEventAgs e) { ... }
es muy importante a notar º en ambos casos, la palabra clave event
está presente. Un evento declarado explícitamente como tal a través de la palabra clave event
ya no es un campo de la clase. En cambio, se convierte en una propiedad de evento . Las propiedades del evento son similares a las propiedades normales, excepto que no tienen accesos get
o set
. El compilador les permite ser utilizados solo en el lado izquierdo de las asignaciones +=
y -=
(agregando o eliminando un manejador de eventos). No hay forma de sobrescribir los controladores de eventos ya asignados, o invocar el evento fuera de la clase que declara.
Si la palabra clave caso faltaba en ambos ejemplos, se puede hacer las siguientes operaciones sin error o advertencia:
obj.Leave = LeaveHandler;
que borrar cualquier gestores registrados y reemplazarlos withe la LeaveHandler
.
Además, también se puede realizar esta llamada:
obj.Leave(new EmployeeEventAgs());
Los dos ejemplos anteriores se consideran una anti-patrón, si tiene la intención de crear un evento. Un evento debe invocarse solo por el objeto propietario y no debe permitir imposible de rastrear eliminación de suscriptores. La palabra clave event
es la construcción programática de .NET que lo ayuda a seguir con el uso correcto de los eventos.
Teniendo todo lo anterior en mente, creo que muchas personas se adhieren al enfoque EventHandler
porque es más improbable que usen un EventHandler
sin la palabra clave event
. Las acciones tienen un alcance más amplio de uso, no se ven tan naturalmente cuando se usan como eventos. Esta última es, por supuesto, una opinión personal, ya que el enfoque del controlador de eventos probablemente se haya vuelto demasiado rígido en mis prácticas de codificación. Aún así, si las acciones se usan correctamente, no es un crimen usarlas para eventos.
Este es un buen consejo, pero no creo que responda la pregunta –
¿Declaraste el manejador 'Leave' como un delegado, en lugar de: public __event__ EventHandler <> ... a propósito? La palabra clave 'event' cambia bastante las reglas de juego cuando trabajas con la clase exponiendo el evento, ya que sin él uno simplemente podría borrar toda la colección de eventos usando' obj.Leave = someHandler' en lugar de 'obj.Leave + = someHandler ' –
No, eso fue un error. Nadie se dio cuenta en tres años :) ¡Gracias! –