Dire che ho un semplice (il più semplice?) C# programma:Costanti di stringa incorporate due volte in .Net?
class Program {
static void Main() {
System.Console.WriteLine("Hello, world");
}
}
Se, compilo il codice e guardo il file exe risultante, vedo il "Ciao, mondo" stringa l'immagine exe come in previsto.
Se refactoring del codice per:
class Program {
const string Greeting = "Hello, world";
static void Main() {
System.Console.WriteLine(Greeting);
}
}
Se compilo il codice e guardo il file exe risultante, vedo il "Ciao, mondo" stringa letterale l'immagine exe in due volte. Questo è stato sorprendente per me. Avevo l'impressione che fossero condivisi i letterali delle stringhe e che sarebbe stato visualizzato solo una volta nell'immagine. Qualcuno può spiegarlo? Forse questa seconda copia della stringa è necessaria per i metadati di riflessione?
Per quanto ne so, l'operazione interna avviene durante JIT, non la compilazione per IL. Avrai lo stesso letterale nell'assemblea più e più volte. Ma in fase di esecuzione, tutti vengono compilati in riferimento allo stesso letterale internato. Vedete due istanze nel secondo caso, perché il letterale esiste due volte (una volta per la dichiarazione 'const' e poi di nuovo dove è effettivamente utilizzata). –
Nel tuo secondo caso, la stringa è una costante e non cambierà mai. Il compilatore potrebbe aver deciso che è più veloce includere la stringa in cui viene utilizzata anziché prendere più di un passaggio per ottenere il valore desiderato. – NoChance
Dov'è Eric Lippert quando hai bisogno di lui? –