ancora stringhe
incuriosito da questo post sul forum e poi dal blog di andrea mi sono messo a vedere quele fosse il codice prodotto cal compilatore, è la prima volta che lo faccio ma la curiosità è tanta :).
prendiamo queste semplici righe di codice:
StringBuilder sb = new StringBuilder("Ciao");
sb.Append(" da "); sb.Append("Marco");
Console.WriteLine(sb.ToString()); ////////////////////////////// string string2 = "ciao " + " da " + "marco" + " e " + "alessio"; Console.WriteLine(string2);
una volta compilato il tutto lo diamo in pasto ad ildasm.exe, il Disassembler fornito insieme all SDK del framevork, il codice prodotto è più o meno (ho tagliato qualcosina) questo
IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ldstr "Ciao" IL_000b: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(string) IL_0010: stloc.0 IL_0011: ldloc.0 IL_0012: ldstr " da " IL_0017: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) IL_001c: pop IL_001d: ldloc.0 IL_001e: ldstr "Marco" IL_0023: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string) IL_0028: pop IL_0029: ldloc.0 IL_002a: callvirt instance string [mscorlib]System.Text.StringBuilder::ToString() IL_002f: call void [mscorlib]System.Console::WriteLine(string) <b> IL_0034: ldstr "ciao da marco e alessio"</b> IL_0039: stloc.1 IL_003a: ldloc.1 IL_003b: call void [mscorlib]System.Console::WriteLine(string) IL_0040: ret
da notare il grassetto come il compilatore ottimizzi il codice salvando la stringa già concatenata nei metadati, quindi se si concatenano stringhe il cui "valore" è conosciuto in fase di compilazione il "+" risulta estremamente più performante, sto facendo anche delle prove con una semplicissima applicazione console
using System;
using System.Text;
namespace ConsoleApplication1 {
class Class1 {
[STAThread] static void Main(string[] args) {
string a = Console.ReadLine();
string b = Console.ReadLine();
string c = Console.ReadLine();
StringBuilder sb = new StringBuilder(a);
sb.Append(b);
sb.Append(c);
Console.WriteLine(sb.ToString());
string string2 = a+b+c;
Console.WriteLine(string2); } } }











