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); } } }
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Nella stessa categoria
- ma dove vai se il var non ..., il 19 luglio 2006 alle 14:47
- DLINQ volume due, il 15 settembre 2005 alle 15:43
- DLinq mi piace , il 15 settembre 2005 alle 10:19
- in parziale rettifica o precisazione di quanto detto(...), il 13 dicembre 2004 alle 08:00
- interfacce, implementazioni esplicite, l'1 dicembre 2004 alle 14:12
I più letti del mese