2015-07-14 12 views
6

Betrachten Sie den folgenden Beispielcode.Unterschied in CSC und Roslyn-Compiler statische Lambda-Ausdruck Auswertung?

class Program 
{ 
    static void Main(string[] args) 
    { 
     DoSomethingWithAction(i => 
      { 
       Console.WriteLine("Value: {0}", i); 
      }); 

     Console.ReadLine(); 
    } 

    private static void DoSomethingWithAction(Action<int> something) 
    { 
     Console.WriteLine(something.Target == null 
      ? "Method is static." 
      : "Method is not static."); 

     something(5); 
    } 
} 

Wenn ich kompilieren und diesen Code ausführen unter Debug das Visual Studio 2010 (unter CSC-Compiler) verwenden wird das folgende Ergebnis ausdrucken:

Method is not static. 
Value: 5 

Wenn ich den gleichen Code kompilieren in Visual Studio 2010, aber dieses Mal mit Veröffentlichung Einstellungen wird die folgende Ausgabe erzeugt:

Method is static. 
Value: 5 

Nun, wenn wir den gleichen Code auszuführen waren aber diesmal Visual Studio 2015 CTP (unter dem Roslyn Compiler) verwenden, wird die folgende Ausgabe für Einstellungen sowohl Debug und Veröffentlichung generiert:

Method is not static. 
Value: 5 

Erste Ich finde es merkwürdig, dass es einen Unterschied zwischen den Debug- und Release-Versionen von VS2010 (CSC) gibt. Warum sollte es nicht als statische Methode unter Debug ausgewertet werden? Es scheint auch, dass es in einigen Fällen als statisch ausgewertet wird, wenn in Debug kompiliert wird. Ich habe eine Produktionsanwendung, die unter Debug das erwartete statische Ergebnis erhält.

Zweitens, sollte der Roslyn-Compiler das Verhalten von CSC in diesem speziellen Fall übereinstimmen?

+1

Die IL hat kein Konzept von Lambdas. Lambdas werden zum anonymen Typ kompiliert. Wie die verknüpfte Frage zeigt, kann der Compiler statische Methoden erzeugen, wenn keine Closures involviert sind. Ihr Code sollte nicht von einem solchen Verhalten abhängen, es ist ausschließlich eine Frage der Compiler-Implementierung und Optimierungen –

+2

@PanagiotisKanavos Ja, ich verstehe warum und stimme mit Ihnen überein, dass der Code nicht von diesem Verhalten abhängen sollte, es ist nur etwas, das ich gefunden und Ich war neugierig auf den Unterschied. Ich stimme nicht zu, dass diese Frage ein Duplikat der verknüpften Frage war. Meine Frage versteht, dass es Methoden statisch machen kann, wenn keine Schließungen existieren. Meine Frage war im Grunde zu fragen, warum der Roslyn-Compiler das überhaupt nicht tun würde. – deloreyk

+0

Siehe https://roslyn.codeplex.com/workitem/246, was erklärt, warum diese Änderung vorgenommen wurde. – SLaks

Antwort

11

Dies war eine bewusste Änderung, die vom Roslyn-Team vorgenommen wurde.

Delegaten, die auf Instanzmethoden verweisen, können etwas schneller aufgerufen werden. Daher kompiliert Roslyn jetzt lambdas, um Methoden zu instanzen, selbst wenn dies nicht erforderlich ist.

Siehe discussion.