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.