2009-11-19 15 views
9

Il C# esegue un'ottimizzazione in fase di compilazione per la concatenazione di stringhe costanti? In tal caso, come deve essere scritto il mio codice per trarne vantaggio?C# Concatenazione in fase di compilazione per costanti stringa

Esempio: come si confrontano in fase di esecuzione?

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

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

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

risposta

15

Sì, lo fa. È possibile verificare questo utilizzando ildasm o Reflector per ispezionare il codice.

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

si traduce per

.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 

C'è qualcosa di ancora più interessante, ma correlate che accade. Se si dispone di una stringa letterale in un assieme, CLR creerà un solo oggetto per tutte le istanze dello stesso valore letterale nell'assieme.

Così:

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

stamperà "True" sulla console! Questa ottimizzazione è denominata string interning.

6

Secondo Reflector:

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

anche in una configurazione di debug.

Problemi correlati