2008-10-29 7 views
5

Quel est le point dans le modèle standard pour les délégués d'événements dans .net? C'est à dire. le délégué prédéfini EventHandler? Pourquoi ne pas simplement choisir la signature la plus appropriée pour l'exigence?Modèle de signature d'événement dans .net

Edit: Et de plus, est-il nécessaire de suivre servilement l'exemple de Microsoft dans tous les cas?

Répondre

3

Il est principalement pour la cohérence et versioning avec le sender paramater comme toujours System.Object et le paramètre args comme toujours un System.EventArgs, ou une classe dervied de celui-ci, vous pouvez modifier l'argument de l'expéditeur qui lui est passé ainsi que le changement le type EventArgs par la suite sans casser le code existant.

L'idiome complet de .NET a été conçu pour prendre en charge le développement basé sur les composants, où le code appelant n'est pas sous le contrôle du développeur du composant avec les événements.

2

Il déconnecte l'appelant de l'appelé.

3

Ceci est une bonne question. Hérétique, mais bon. J'ai lu récemment un billet de blog (je ne trouve pas le lien - quelqu'un a ce lien) qui a démystifié le mythe selon lequel vous devez toujours remplacer System.EventArgs pour assurer une bonne gestion des événements. Je suis tout pour la convention et le respect des règles, mais je pense que c'est une question qui peut être considérée comme pliable, voire évitable. Ayant besoin de remplacer systématiquement System.EventArgs pour chaque événement ajoute au couplage de la routine - maintenant il y a encore une autre chose à suivre. Avoir un «e» qui fournit des membres n'est pas plus utile ou intuitif qu'un ensemble bien nommé d'arguments. Je ne pense pas que l'argument peut être gagné pour distribuer le modèle System.EventArg recommandé, mais je l'ai mis avec vous pour faire cet argument.

rp

4

En C# 1.0 la convention n'a pas fait beaucoup de sens. En C# 2.0, où il y a une certaine variance de délégué, cela a plus de sens.

Si vous avez une méthode de gestion d'événement qui ne se soucie pas vraiment des paramètres, par ex.

public void SaveDocument(object sender, EventArgs args) 
{ 
    // Save the document here 
} 

vous pouvez maintenant utiliser cette méthode pour souscrire à tout événement qui suit la convention, même si l'expéditeur réel ou args sont plus strictement typés. Cela signifie que vous pouvez utiliser le même gestionnaire pour un événement clavier, un clic de bouton, etc.