2016-07-06 26 views
0

Ich weiß, dass die CLR einige Codes optimieren würde, aber ich weiß nicht, was sie ist, wie der folgende Code:wenn der Code in C# dll läuft?

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Program p = new Program(); 
      string another = "a"; 
      var no = p.SNo; 
      var field = p.FieldA; 
      string name = "stackoverflow" + p.Name; 
      var a = p.Name; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("yes, clr runs it"); 
     } 
     Console.WriteLine("over"); 
    } 

    public string FieldA; 

    public string Name 
    { 
     get 
     { 
      return GetName(); 
     } 
    } 

    public string SNo 
    { 
     get; 
     set; 
    } 

    public string GetName() 
    { 
     throw new Exception("can you run at here?"); 
    } 
} 

Umgebung: .net 4.0 + vs2015 + Win7x64 Ausgabe im Debug-Modus (es läuft string another = "a";):

ja, clr läuft es

über

Ausgabe im Release-Modus (der gleiche wie Debug-Modus), und es das 'Optimieren Code' Flag:

ja, clr läuft es

über

dann finde ich den Code in dll:

private static void Main(string[] args) 
{ 
    try 
    { 
     Program program = new Program(); 
     string sNo = program.SNo; 
     string fieldA = program.FieldA; 
     string text3 = "stackoverflow" + program.Name; 
     string name = program.Name; 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("yes, clr runs it"); 
    } 
    Console.WriteLine("over"); 
} 

die string another = "a"; ist verschwunden, aber die Eigenschaft program.SNo und das Feld program.FieldA und der nicht Verwenden Sie text3 sind da.

Also, was hat die clr getan? und wird es anders sein, wenn es eine aps.net-Anwendung wird, die im IIS läuft? hat der IIS etwas gemacht?

Antwort

1

Das Entfernen von totem Code, einschließlich nicht verwendeter Variablen, ist eine der grundlegendsten Optimierungen, die ein Compiler macht. Codeanalyse wirft eine Warnung dafür: CA1804: Remove unused locals und es heißt sehr explizit:

Beachten Sie, dass das C# -Compiler [...] nicht verwendete lokale Variablen entfernt, wenn die optimize Option aktiviert ist.

+0

danke zuerst, aber program.SNo und program.FieldA werden auch nicht verwendet, warum sind sie in der dll? Wenn der Code in dll der richtige Code ist, der ausgeführt werden soll? – windc

+1

Weil das keine Einheimischen sind. Nicht verwendete Locals sind garantiert nicht erreichbar, aber unbenutzte Felder in einer DLL werden möglicherweise von einer anderen App konsumiert, die auf diese DLL verweist. Nichts für ungut, aber du triffst kaum die Oberfläche eines riesigen Wissens, das ich noch nicht beherrsche. Sie können viel über Compiler-Optimierung lesen und lernen. Hier ist etwas kurz, um Appetit zu machen: [Was macht der Optimierungsschalter?] (Https://blogs.msdn.microsoft.com/ericlippert/2009/06/11/what-does-the-optimize-switch-do /) –

+0

danke nochmal, ich lese diesen Artikel und weiß warum es so ein wenig geht, jetzt meine Frage: 1: gibt es nur clr kompilieren und jitter optimieren? 2: Wenn 1 wahr ist, gibt es keine Möglichkeit, herauszufinden, was es echten laufenden Code ist? Ich frage mich, wie mein Programm funktioniert. – windc