2009-08-11 4 views
4

Je voudrais m'inscrire à un événement. Les manières suivantes fonctionnent:Y at-il une différence entre les façons suivantes de s'inscrire à l'événement?

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += onOptionSelectedChanged; 
    } 

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += new EventHandler(onOptionSelectedChanged); 
    } 

Y at-il une différence ou que c'est juste une syntaxe différente pour la même chose?

+0

Ceci est une dupe. –

+0

aucune différence. mon 0.02c, même chose est vrai pendant que vous annulez l'enregistrement. –

+2

@Mehrdad - Vous pouvez au moins avoir la décence de donner un lien vers le doublon – Elad

Répondre

9

Identique - Pas de diff. Le compilateur déduit le type de délégué et le fait automatiquement par magie pour vous. Du sucre syntactique pour vous rendre la vie un peu plus facile

Juste vérifié avec profondeur C#. Cette fonctionnalité est appelée "Conversions de groupe de méthodes"; ajouté en C# 2,0

par ex. du livre

static void MyMethod() { ... } 
static void MyMethod(object sender, EventArgs e) {...} 

static void Main() { 
    ThreadStart x = MyMethod; // binds to first overload 
    EventHandler y = MyMethod; // binds to second overload 
} 

Si j'ouvre cela dans le réflecteur, vous verriez que le compilateur vient de créer les instances de délégué du type pour vous, dans les coulisses de cours.

L_0000: ldnull 
    L_0001: ldftn void CS.Temp.Program::MyMethod() 
    L_0007: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int) 
    L_000c: pop 
    L_000d: ldnull 
    L_000e: ldftn void CS.Temp.Program::MyMethod(object, class [mscorlib]System.EventArgs) 
    L_0014: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int) 
    L_0019: pop 
+0

Ce dernier est un ancien sintax qui était requis au 1.1, si ma mémoire est bonne. Ou peut-être que c'était 2.0. Mais maintenant le compilateur fait le tour par lui-même. –

+0

Droit vous êtes .. Était en train de revenir en arrière avec le livre de référence :) Le compilateur 2.0+ est maintenant assez intelligent convertir un groupe méthode/méthode pour le bon type de délégué – Gishu

3

C'est la même chose, le nouveau EventHandler() est juste redondant.

Vous n'avez pas besoin de créer explicitement un délégué pour un gestionnaire d'événements.

+0

La petite différence est que le premier ne compilera pas dans C# 1.0. –

+0

Bon point, mais comme la question a été étiquetée C# 3.0, je n'ai pas pensé à le mentionner. – Brandon

0

En ce qui concerne l'exécution, il n'y a pas de différence. Le compilateur les voit comme légèrement différent en ce sens qu'il doit déduire la signature pour le délégué (votre méthode de gestion d'événement) basée sur la signature de l'événement lui-même tandis que dans la seconde on lui dit ce que la signature devrait être.

La deuxième signature est celle qui est générée automatiquement pour vous par Visual Studio si vous utilisez la commande "Automatique" (c'est-à-dire la séquence "Onglet, onglet") lors de l'abonnement à un événement.

Questions connexes