C # compilazione-Time concatenazione Per costanti stringa
-
21-09-2019 - |
Domanda
La C # fare alcuna ottimizzazione in fase di compilazione di un costante concatenazione di stringhe? Se sì, come deve il mio codice scritto per approfittare di questo?
Esempio:? Come questi confrontano in fase di esecuzione
Console.WriteLine("ABC" + "DEF");
const string s1 = "ABC";
Console.WriteLine(s1 + "DEF");
const string s1 = "ABC";
const string s2 = s1 + "DEF";
Console.WriteLine(s2);
Soluzione
Sì, lo fa. È possibile verificare questo utilizzando utilizzando ildasm
o Reflector per ispezionare il codice.
static void Main(string[] args) {
string s = "A" + "B";
Console.WriteLine(s);
}
è tradotto in
.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
C'è qualcosa di ancora più interessante, ma correlate che accade. Se si dispone di una stringa letterale in un assembly, il CLR creerà un solo oggetto per tutte le istanze di quella stessa letterale nell'assieme.
In questo modo:
static void Main(string[] args) {
string s = "A" + "B";
string t = "A" + "B";
Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true!
}
stamperà "True" sulla console! Questa ottimizzazione è chiamato stringa internato .
Altri suggerimenti
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
anche in una configurazione di debug.