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);
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top