Question

Est-ce que C # faire une optimisation de la compilation pour la concaténation de chaîne constante? Si oui, comment doit mon code par écrit pour tirer profit de cette situation?

Exemple: Comment se comparent-elles à l'exécution

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

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

const string s1 = "ABC";
const string s2 = s1 + "DEF";
Console.WriteLine(s2);
Était-ce utile?

La solution

Oui, il le fait. Vous pouvez vérifier cela à l'aide en utilisant ildasm ou réflecteur pour inspecter le code.

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

est 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 une chaîne de caractères dans un ensemble, le CLR ne créer un objet pour toutes les instances de ce même littéral dans l'ensemble.

Ainsi:

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

affichera "True" sur la console! Cette optimisation est appelée interner.

Autres conseils

Selon réflecteur :

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

même dans une configuration de débogage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top