C # Compile temps Enchaînement Pour Constantes STRING
-
21-09-2019 - |
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);
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.