En realidad, hay una buena razón para requerir que el segundo argumento derive de EventArgs
si su código totalmente confiable hospeda el código de terceros como parcialmente de confianza.
Como la devolución de llamada al delegado encargado de la gestión de eventos se realiza en el contexto del código ascendente y no del código de terceros, es posible que el código malintencionado de terceros agregue una operación privilegiada del sistema como controlador de eventos y potencialmente ejecute una escalada de ataque de privilegios ejecutando código en su contexto de plena confianza para que su contexto parcialmente confiable no pueda ejecutarse.
Por ejemplo, si declara un controlador como tipo int -> void
, el código de tercero podría enrutar YourEvent += Enviroment.Exit(-1)
y hacer que salga del proceso involuntariamente. Obviamente, esto causaría un problema fácil de detectar, pero hay muchas más API malintencionadas que podrían ponerse en cola para hacer otras cosas.
Cuando la firma es (object, EventArgs) -> void
, no hay operaciones privilegiadas en el marco que se puedan enrutar porque ninguna de ellas es compatible con esta firma. Es parte de la revisión del código de seguridad en el marco para garantizar esto (desafortunadamente no puedo encontrar la fuente donde lo leí).
Por lo tanto, en determinadas circunstancias, existen motivos de seguridad válidos sobre por qué debe utilizar el patrón estándar. Si está 100% seguro de que su código nunca se utilizará en estas circunstancias, entonces la guía de firmas de eventos no es tan importante (aparte de que otros desarrolladores piensen en WTF), pero si es así, debería seguirla.
Entonces también puede utilizar Action como su delegado. –
Sí, es muy cierto, por lo que ampliaré mi pregunta: ¿por qué no utilizar Action? –
RichK