Como se vio en el post dedicado a java, es posible utilizar el compilador a nuestro favor, cuando se conoce como funciona.
En el siguiente ejemplo, se muestra una concatenacion, utilizando el operador +.
01: using System; 02: using System.Collections.Generic; 03: using System.Linq; 04: using System.Text; 05: 06: namespace ClassLibrary1 07: { 08: public class Class1 09: { 10: void Test() 11: { 12: string a = "cadena1"; 13: string b = "cadena2"; 14: string x = a + b; 15: Console.WriteLine(x); 16: } 17: } 18: } 19:
Al decompilar el codigo, empleando el comando ildasm, se obtiene el siguiente codigo:
.method private hidebysig instance void Test() cil managed
{
// Code size 29 (0x1d)
.maxstack 2
.locals init ([0] string a,
[1] string b,
[2] string x)
IL_0000: nop
IL_0001: ldstr "cadena1"
IL_0006: stloc.0
IL_0007: ldstr "cadena2"
IL_000c: stloc.1
IL_000d: ldloc.0
IL_000e: ldloc.1
IL_000f: call string [mscorlib]System.String::Concat(string,
string)
IL_0014: stloc.2
IL_0015: ldloc.2
IL_0016: call void [mscorlib]System.Console::WriteLine(string)
IL_001b: nop
IL_001c: ret
} // end of method Class1::Test
El codigo que genera codigo similar es el siguiente:
01: using System; 02: using System.Collections.Generic; 03: using System.Linq; 04: using System.Text; 05: 06: namespace ClassLibrary1 07: { 08: public class Class2 09: { 10: void Test() 11: { 12: string x = String.Concat("cadena1","cadena2"); 13: Console.WriteLine(x); 14: } 15: } 16: } 17:
Como es posible observar, el codigo generado ejecuta una funcion propia de la clase String, la cual sabe concatenar cadenas, generando una nueva cadena del tamaño necesario. Sin embargo, este comportamiento solo se presenta cuando se emplean 2, 3 y hasta 4 cadenas, ya cuando se trata de 5 o mas cadenas, primero construye un arreglo de cadenas, con las cadenas a concatenar y posteriormente emplea el metodo Concat(String[]). Por ejemplo:
01: using System; 02: using System.Collections.Generic; 03: using System.Linq; 04: using System.Text; 05: 06: namespace ClassLibrary1 07: { 08: class Class3 09: { 10: void Test() 11: { 12: string a = "cadena1"; 13: string b = "cadena2"; 14: string c = "cadena3"; 15: string d = "cadena4"; 16: string e = "cadena5"; 17: string x = a + b + c + d + e; 18: Console.WriteLine(x); 19: } 20: } 21: } 22:
Produciendo el siguiente codigo:
.method private hidebysig instance void Test() cil managed
{
// Code size 84 (0x54)
.maxstack 3
.locals init ([0] string a,
[1] string b,
[2] string c,
[3] string d,
[4] string e,
[5] string x,
[6] string[] CS$0$0000)
IL_0000: nop
IL_0001: ldstr "cadena1"
IL_0006: stloc.0
IL_0007: ldstr "cadena2"
IL_000c: stloc.1
IL_000d: ldstr "cadena3"
IL_0012: stloc.2
IL_0013: ldstr "cadena4"
IL_0018: stloc.3
IL_0019: ldstr "cadena5"
IL_001e: stloc.s e
IL_0020: ldc.i4.5
IL_0021: newarr [mscorlib]System.String
IL_0026: stloc.s CS$0$0000
IL_0028: ldloc.s CS$0$0000
IL_002a: ldc.i4.0
IL_002b: ldloc.0
IL_002c: stelem.ref
IL_002d: ldloc.s CS$0$0000
IL_002f: ldc.i4.1
IL_0030: ldloc.1
IL_0031: stelem.ref
IL_0032: ldloc.s CS$0$0000
IL_0034: ldc.i4.2
IL_0035: ldloc.2
IL_0036: stelem.ref
IL_0037: ldloc.s CS$0$0000
IL_0039: ldc.i4.3
IL_003a: ldloc.3
IL_003b: stelem.ref
IL_003c: ldloc.s CS$0$0000
IL_003e: ldc.i4.4
IL_003f: ldloc.s e
IL_0041: stelem.ref
IL_0042: ldloc.s CS$0$0000
IL_0044: call string [mscorlib]System.String::Concat(string[])
IL_0049: stloc.s x
IL_004b: ldloc.s x
IL_004d: call void [mscorlib]System.Console::WriteLine(string)
IL_0052: nop
IL_0053: ret
} // end of method Class3::Test
En cambio, el compilador de C# al igua que el de java, es capaz de detectar cadenas constantes "inline" y generar una cadena con el resultado en tiempo de compilacion, evitando el procesamiento en tiempo de ejecucion
01: using System; 02: using System.Collections.Generic; 03: using System.Linq; 04: using System.Text; 05: 06: namespace ClassLibrary1 07: { 08: public class Class4 09: { 10: void Test() 11: { 12: string x = "cadena1" + "cadena2"; 13: Console.WriteLine(x); 14: } 15: } 16: } 17:
Generando el siguiente codigo:
.method private hidebysig instance void Test() cil managed
{
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] string x)
IL_0000: nop
IL_0001: ldstr "cadena1cadena2"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::WriteLine(string)
IL_000d: nop
IL_000e: ret
} // end of method Class4::Test
El compilador puede ayudar en el desempeño del sistema, al generar algunas de estas operaciones previamente.