2009-11-19 13 views
9

Czy C# wykonuje optymalizację w czasie kompilacji dla ciągłego łączenia ciągów? Jeśli tak, to w jaki sposób mój kod powinien zostać napisany, aby to wykorzystać?C# Łączenie w czasie kompilacji dla stałych łańcuchowych

Przykład: W jaki sposób porównuje się je w czasie wykonywania?

Console.WriteLine("ABC" + "DEF"); 

const string s1 = "ABC"; 
Console.WriteLine(s1 + "DEF"); 

const string s1 = "ABC"; 
const string s2 = s1 + "DEF"; 
Console.WriteLine(s2); 

Odpowiedz

15

Tak, robi. Możesz to sprawdzić, korzystając z ildasm lub Reflektora, aby sprawdzić kod.

static void Main(string[] args) { 
    string s = "A" + "B"; 
    Console.WriteLine(s); 
} 

jest tłumaczona na

.method private hidebysig static void Main(string[] args) cil managed { 
    .entrypoint 
    // Code size  17 (0x11) 
    .maxstack 1 
    .locals init ([0] string s) 
    IL_0000: nop 
    IL_0001: ldstr  "AB" // note that "A" + "B" is concatenated to "AB" 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000d: nop 
    IL_000e: br.s  IL_0010 
    IL_0010: ret 
} // end of method Program::Main 

Jest coś jeszcze bardziej interesujące, ale podobne do tego dojdzie. Jeśli masz literał ciągu w zespole, CLR utworzy tylko jeden obiekt dla wszystkich wystąpień tego samego literału w zespole.

Zatem:

static void Main(string[] args) { 
    string s = "A" + "B"; 
    string t = "A" + "B"; 
    Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true! 
} 

wypisze "True" na konsoli! Ta optymalizacja nazywa się string interning.

6

Według Reflector:

Console.WriteLine("ABCDEF"); 
Console.WriteLine("ABCDEF"); 
Console.WriteLine("ABCDEF"); 

nawet w konfiguracji Debug.

Powiązane problemy