2009-08-25 5 views
7

J'ai toujours affecté des gestionnaires d'événements comme celui-ci, guidés par l'auto-complétion Intellisense.Différences dans l'affectation des gestionnaires d'événements C#?

RangeSelector.RangeChanged += new EventHandler(RangeSelector_RangeChanged); 

J'ai récemment remarqué qu'un de mes collègues le faisait de cette façon.

RangeSelector.RangeChanged += RangeSelector_RangeChanged; 

Les deux méthodes sont syntaxiquement correctes, compilent et se comportent comme prévu.

Quelles sont les différences, les avantages ou les inconvénients de ces méthodes. Est-ce qu'ils aboutissent au même code IL ou y a-t-il une différence subtile dont je dois être conscient?

Répondre

12

Quelles sont les différences, les avantages ou les inconvénients de ces méthodes.

La seconde méthode est plus récent, à savoir qu'il est seulement supporté depuis C# 2.0 (je crois), qui ajoute une conversion automatique à partir d'un groupe de procédé (par exemple un nom de méthode) à un délégué. L'appel du constructeur est donc ajouté par le compilateur et la seconde méthode est juste du sucre syntaxique pour le premier. De ce fait, il n'y a pas d'autres différences entre les deux.

Puisque la seconde méthode fait la même chose que la première, avec moins de syntaxe, elle devrait être préférée.

+1

En outre, si vous changez la signature de l'événement, il vous suffit de modifier le code en deux endroits, la déclaration de l'événement, et le gestionnaire lui-même, mais pas partout où vous affectez/désaffectez le gestionnaire. –

+2

+1, Cependant quant à "devrait être préféré" c'est discutable. Si vous tapez + = suivi de deux fois le bouton de tabulation, vous générez la nouvelle syntaxe, je suis d'accord. Actuellement, le moyen le plus rapide d'ajouter un gestionnaire d'événements est de générer l'ancienne syntaxe avec l'aide des IDE. – AnthonyWJones

+0

@Matthew Scharley: si vous utilisez le support de refactoring intégré de Visual Studio, vous n'aurez pas à vous soucier de telles choses. –

3

Aucune différence, il en résulte la même IL.

C'est juste une façon de dire la même chose avec moins de code.

3

Le résultat est le même dans les deux cas. Mais dans ce dernier, le compilateur C# déduira le type EventHandler du code, vous épargnant ainsi quelques coups de touches.

2

oui, compilateur crée le même code IL dans les deux cas, le second cas est juste sucre syntaxe

Questions connexes