2008-08-25 7 views
14

En C#, quelle est la différence (le cas échéant) entre ces deux lignes de code?Différence entre les événements de câblage avec et sans "nouveau"

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick); 

et

tmrMain.Elapsed += tmrMain_Tick; 

Les deux semblent fonctionner exactement la même chose. Est-ce que C# suppose simplement que vous voulez dire le premier lorsque vous tapez le dernier?

+0

Eh bien, ils fonctionnent tous les deux bien. Alors pourquoi Visual Studio choisit-il le premier sur ce dernier lorsqu'il crée automatiquement le stub du gestionnaire d'événements? – Vaibhav

+0

Cette fonctionnalité date d'avant Visual Studio 2005, qui a introduit la syntaxe la plus courte. – SLaks

Répondre

25

Je l'ai fait

static void Hook1() 
{ 
    someEvent += new EventHandler(Program_someEvent); 
} 

static void Hook2() 
{ 
    someEvent += Program_someEvent; 
} 

Et puis a couru ildasm sur le code.
Le MSIL généré était exactement le même. Donc, pour répondre à votre question, oui, ils sont la même chose. Le compilateur
est juste infère que vous voulez someEvent += new EventHandler(Program_someEvent);
- Vous pouvez le voir créer le nouvel objet EventHandler dans les deux cas dans le MSIL

2

Je ne pense pas qu'il y ait une différence. Certes, resharper dit que la première ligne a un code redondant.

-1

Je pense que la seule façon de vraiment dire serait de regarder le MSIL produit pour le code .. Tend à être un bon test d'acide ..

J'ai drôles préoccupations qu'il peut en quelque sorte mess avec GC. Il semble étrange qu'il y ait tout le temps nécessaire pour déclarer le nouveau type de délégué si cela n'a jamais été fait de cette façon, vous savez?

0

Le code new XYZEventHandler ne vous a pas été nécessaire avant C# 2003, et vous avez été autorisé à omettre le code redondant dans C# 2005?

4

Il était (.NET 1.x jours) que la forme longue était la seule façon de le faire. Dans les deux cas, vous créez un délégué pour pointer vers la méthode Program_someEvent.

2

Un peu offtopic:

Vous pouvez instancier un délégué (new EventHandler(MethodName)) et (le cas échéant) réutiliser cette instance.

Questions connexes