通常我不会在这里问这个问题,但我似乎没有找到任何关于在这种情况下会发生什么的文章。请看以下示例:
string s = "Potato";
string t = "Carrot, " + s + ", Bean";
在第二行中,编译器是否会将此优化为将一个字符串与Carrot添加到开头并将bean添加到结尾,或者它是否会为Carrot和Bean创建字符串,然后连接每个字符串以创建字符串?< / p>
我认为不同的编译器可能会以不同的方式运行,但一般来说这里会发生什么?
答案 0 :(得分:8)
在第二行中,编译器是否会将此优化为将一个字符串与Carrot添加到开头并将bean添加到结尾,或者它是否会为Carrot和Bean创建字符串,然后连接每个字符串以创建字符串?< / p>
后者,因为s
不是编译时常量表达式。如果您将s
的声明更改为:
const string s = "Potato";
... 然后它将在编译时执行连接。您可以通过编译包含两个版本的代码来验证这一点,然后使用ildasm
查看结果 - 在您的情况下,您会看到对string.Concat(string, string, string)
的调用,而使用const string s
我会在IL中看到已经连接的字符串。