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

Jos*_*ant 9 c# string string-concatenation compile-time

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);
Run Code Online (Sandbox Code Playgroud)

jas*_*son 15

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

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

被翻译成

.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
Run Code Online (Sandbox Code Playgroud)

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

从而:

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

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


Joe*_*oey 6

根据Reflector:

Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Run Code Online (Sandbox Code Playgroud)

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