2009-07-24 5 views
0

De How to: Publish Events that Conform to .NET Framework GuidelinesPourquoi les paramètres de base à gestionnaires d'événements personnalisés à partir EventArg

Bien que les événements dans les classes que vous définis peuvent être basées sur tout type délégué valide, même les délégués qui retournent une valeur, il est généralement recommandé que vous basez vos événements sur le modèle .NET Framework en utilisant EventHandler, comme indiqué dans l'exemple suivant .

Pourquoi? Que diriez-vous:

public delegate void GenericEventHandler<TType, TArgs>(TType sender, TArgs args); 
public event GenericEventHandler<SomeSender, SomeArg> SomeEvent; 

Répondre

2

principalement de sorte que toute méthode avec la signature (object sender, EventArgs e) peut gérer votre événement. Gardez à l'esprit que les délégués sont des variantes (types de retour covariants et types d'arguments contravariants).

+0

+1. vous le méritez, je ne suis pas aussi élaboré que la plupart des gens ici. –

+0

Il y a de la valeur dans cela. Cependant, connaître les types de vos paramètres me semble plus précieux. – pomeroy

+0

Je ne suis pas sûr de comprendre votre objection. Vous n'utilisez généralement pas 'EventArgs' tel quel, vous en dérivez un type, ajoutez toutes les informations dont cet événement aura besoin, et utilisez-le. Le gestionnaire d'événements est libre de "connaître le type" de cet argument, ou de l'ignorer (et d'accepter simplement 'EventArgs'), en fonction des besoins spécifiques. Ou est-ce que vous n'aimez pas que le type d'argument 'sender' soit toujours' object'? –

1

Juste pour rendre ceci à jour: Depuis .NET 4.5 il n'y a pas une telle contrainte. Nouvelle signature est:

[SerializableAttribute] 
public delegate void EventHandler<TEventArgs>(
    Object sender, 
    TEventArgs e 
) 

Auparavant, il était:

[SerializableAttribute] 
public delegate void EventHandler<TEventArgs>(
    Object sender, 
    TEventArgs e 
) 
where TEventArgs : EventArgs 

Je ne pouvais pas trouver pourquoi un tel changement. Ce serait génial si quelqu'un pouvait fournir des explications à partir des développeurs .NET de leur décision.