En fonction des réponses précédentes, je vais casser ma réponse en trois zones.
D'abord, les limites physiques de l'aide d' Action<T1, T2, T2... >
vs à l'aide d'une classe dérivée de l' EventArgs
. Il en existe trois: tout d'Abord, si vous modifiez le nombre ou les types de paramètres, chaque méthode qui s'abonne à devront être modifiés pour les rendre conformes au nouveau modèle. Si c'est face au public, événement que la 3e partie des assemblées utiliser, et il n'y a aucune possibilité que l'événement args allait changer, ce serait une raison pour utiliser une classe dérivée de l'événement args pour la cohérence de saké (n'oubliez pas, vous pouvez toujours utiliser un Action<MyCustomClass>
) en Second lieu, à l'aide de Action<T1, T2, T2... >
vous empêcherait de passer de RETOUR à l'appel de la méthode, sauf si vous avez un certain type de l'objet (avec une manche de la propriété par exemple) qui est transmis en même temps que l'Action. Troisièmement, vous n'obtenez pas les paramètres nommés, donc si vous êtes de passage 3 bool
's un int
, deux string
s', et un DateTime
, vous n'avez aucune idée de ce que le sens de ces valeurs. Comme une note de côté, vous pouvez toujours avoir un "Feu de cet événement en toute sécurité de la méthode tout en utilisant Action<T1, T2, T2... >
".
Deuxièmement, la cohérence des implications. Si vous avez un grand système, vous travaillez déjà avec, il est presque toujours préférable de suivre la façon dont le reste de l'installation est conçue, sauf si vous avez une très bonne raison de ne pas trop. Si vous avez publiquement face aux événements qui doivent être maintenues, la capacité de remplacer les classes dérivées peuvent être importantes. Gardez cela à l'esprit.
Troisièmement, la vraie vie pratique, personnellement, je trouve que j'ai tendance à créer beaucoup de l'un des événements exceptionnels pour des choses comme des modifications de la propriété que j'ai besoin d'interagir avec (Surtout quand on fait de MVVM avec les modèles de vue qui interagissent les uns avec les autres) ou de l'endroit où l'événement a un seul paramètre. La plupart du temps, ces événements prennent la forme d' public event Action<[classtype], bool> [PropertyName]Changed;
ou public event Action SomethingHappened;
. Dans ces cas, il y a deux avantages. Tout d'abord, je reçois un type pour la délivrance de la classe. Si MyClass
déclare et est la seule classe de tir à l'événement, je reçois explicite d'une instance de MyClass
pour travailler avec le gestionnaire d'événement. Deuxièmement, pour de simples événements tels que le changement de propriété d'événements, la signification des paramètres est évident et est indiqué dans le nom du gestionnaire d'événement et je n'ai pas à créer une multitude de classes de ce type d'événements.