C#编译时字符串常量连接

C#是否对常量字符串连接进行任何编译时优化? 如果是这样,我的代码如何通过编写来利用这个?

示例:这些在运行时如何比较?

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

是的,它确实。 您可以使用ildasm或Reflector来检查代码来validation这一点。

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

被翻译成

 .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 

有一些更有趣但有相关的事情发生了。 如果程序集中有字符串文字,则CLR将仅为程序集中同一文字的所有实例创建一个对象。

从而:

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

将在控制台上打印“True”! 此优化称为字符串实习 。

根据Reflector :

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

即使在Debug配置中也是如此。