Oui, c'est le cas. Vous pouvez vérifier cela en utilisant ildasm
ou Reflector pour inspecter le code.
static void Main(string[] args) {
string s = "A" + "B";
Console.WriteLine(s);
}
se traduit à
.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
Il y a quelque chose encore plus intéressant, mais cela se produit lié. Si vous avez un littéral de chaîne dans un assembly, le CLR crée uniquement un objet pour toutes les instances de ce même littéral dans l'assembly.
Ainsi:
static void Main(string[] args) {
string s = "A" + "B";
string t = "A" + "B";
Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true!
}
imprimera "True" sur la console! Cette optimisation est appelée string interning.