C # tiempo de compilación concatenación Para las constantes de cadena
-
21-09-2019 - |
Pregunta
¿Tiene C # a cabo alguna optimización en tiempo de compilación para la concatenación de cadenas constante? Si es así, ¿debe mi código por escrito para tomar ventaja de esto?
Ejemplo:? ¿Cómo se comparan estos en tiempo de ejecución
Console.WriteLine("ABC" + "DEF");
const string s1 = "ABC";
Console.WriteLine(s1 + "DEF");
const string s1 = "ABC";
const string s2 = s1 + "DEF";
Console.WriteLine(s2);
Solución
Sí, lo hace. Esto se puede verificar usando usando ildasm
o reflector para inspeccionar el código.
static void Main(string[] args) {
string s = "A" + "B";
Console.WriteLine(s);
}
se traduce a
.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
Hay algo aún más interesante, pero relacionados que eso ocurra. Si usted tiene una cadena literal en un ensamblaje, el CLR sólo creará un objeto para todas las instancias de ese mismo literal en la asamblea.
Así:
static void Main(string[] args) {
string s = "A" + "B";
string t = "A" + "B";
Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true!
}
imprimirá "True" en la consola! Esta optimización se llama cadena de internar .
Otros consejos
Según Reflector :
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
incluso en una configuración de depuración.