2009-11-19 4 views
9

C# effectue-t-il une optimisation à la compilation pour la concaténation de chaîne constante? Si oui, comment mon code doit-il être écrit pour en profiter?C# Concaténation à la compilation pour les constantes de chaînes

Exemple: Comment sont-ils comparés au moment de l'exécution?

Console.WriteLine("ABC" + "DEF"); 

const string s1 = "ABC"; 
Console.WriteLine(s1 + "DEF"); 

const string s1 = "ABC"; 
const string s2 = s1 + "DEF"; 
Console.WriteLine(s2); 

Répondre

15

Oui, c'est le cas. Vous pouvez vérifier cela en utilisant ildasm ou Reflector pour inspecter le code.

static void Main(string[] args) { 
    string s = "A" + "B"; 
    Console.WriteLine(s); 
} 

se traduit à

.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 

Il y a quelque chose encore plus intéressant, mais cela se produit lié. Si vous avez un littéral de chaîne dans un assembly, le CLR crée uniquement un objet pour toutes les instances de ce même littéral dans l'assembly.

Ainsi:

static void Main(string[] args) { 
    string s = "A" + "B"; 
    string t = "A" + "B"; 
    Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true! 
} 

imprimera "True" sur la console! Cette optimisation est appelée string interning.

6

Selon Reflector:

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

même dans une configuration de débogage.

Questions connexes