2008-08-25 9 views
14

In C#, was ist der Unterschied (wenn vorhanden) zwischen diesen beiden Codezeilen?Unterschied zwischen Verdrahtungsereignissen mit und ohne "Neu"

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick); 

und

tmrMain.Elapsed += tmrMain_Tick; 

Beide scheinen genau das gleiche zu arbeiten. Geht C# nur davon aus, dass Sie Ersteres meinen, wenn Sie Letzteres eingeben?

+0

Nun, sie funktionieren beide gut. Warum wählt Visual Studio dann erstere aus, wenn es den Ereignishandler-Stub automatisch erstellt? – Vaibhav

+0

Diese Funktion stammt aus der Zeit vor Visual Studio 2005, in der die kürzere Syntax eingeführt wurde. – SLaks

Antwort

25

Ich habe diese

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

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

und lief dann über den Code ildasm.
Die generierte MSIL war genau das gleiche.

Also, um Ihre Frage zu beantworten, ja, sie sind die gleiche Sache.
Der Compiler ist Folgern nur, dass Sie someEvent += new EventHandler(Program_someEvent);
wollen - Sie sehen es das neue EventHandler Objekt in beiden Fällen in den MSIL

2

ein Unterschied Ich glaube nicht, dass es zu schaffen. Sicherlich sagt Resharper, dass die erste Zeile redundanten Code hat.

-1

Ich denke, die eine Art und Weise würde wirklich zu sagen, schauen sein, bei der MSIL für den Code erzeugte .. Neige ein guter Säure-Test zu sein ..

ich lustig Bedenken habe, dass es mit GC irgendwie Chaos kann. Es scheint merkwürdig, dass es den ganzen Overhead geben würde, den neuen Delegattyp zu deklarieren, wenn es nie auf diese Weise gemacht werden müsste, weißt du?

0

War nicht die new XYZEventHandler bis C# 2003 erforderlich, und Sie durften den redundanten Code in C# 2005 weglassen?

4

Früher (.NET 1.x Tage) war die lange Form der einzige Weg, dies zu tun. In beiden Fällen erstellen Sie einen Delegaten neu, um auf die Program_someEvent-Methode zu verweisen.

2

Ein wenig offtopic:

könnten Sie einen Delegierten instanziiert (new EventHandler(MethodName)) und (gegebenenfalls) die Instanz wiederverwenden.