Il y a en fait une bonne raison de requérir que le deuxième argument soit dérivé de EventArgs
si votre code entièrement approuvé héberge du code tiers en partie approuvé.
Parce que le rappel au délégué de gestion des événements est fait dans le contexte du code déclencheur et non du code tiers, il est possible pour du code tiers malveillant d'ajouter une opération système privilégiée en tant que gestionnaire d'événements et ainsi éventuellement exécuter une attaque par élévation de privilèges en exécutant du code dans votre contexte entièrement approuvé que leur contexte partiellement approuvé ne pourrait pas exécuter.
Par exemple, si vous déclarez un gestionnaire de type int -> void
, alors le code tiers pourrait mettre en file d'attente VotreÉvénement += Enviroment.Exit(-1)
et vous faire quitter le processus involontairement. Cela causerait évidemment un problème facile à détecter, mais il existe des API beaucoup plus malveillantes qui pourraient être mises en file d'attente pour faire d'autres choses.
Lorsque la signature est (object, EventArgs) -> void
, il n'y a pas d'opérations privilégiées dans le framework qui peuvent être mises en file d'attente car aucune d'entre elles n'est compatible avec cette signature. Cela fait partie de l'examen de code de sécurité dans le framework pour s'assurer de cela (malheureusement, je ne trouve pas la source où j'ai lu cela).
Donc, dans certaines circonstances, il y a des préoccupations de sécurité légitimes quant à pourquoi vous devriez utiliser le modèle standard. Si vous êtes sûr à 100% que votre code ne sera jamais utilisé dans ces circonstances, alors la directive de signature d'événement n'est pas aussi importante (à part d'autres développeurs pensant WTF), mais si cela pourrait être le cas, alors vous devriez la suivre.