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);
È stato utile?

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

Riflettore :

Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");

anche in una configurazione di debug.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top