如果将字符串引用设置为引号中的字符串,编译器是否会创建额外的字符串?

时间:2016-05-24 16:21:23

标签: c# .net string performance

通常我不会在这里问这个问题,但我似乎没有找到任何关于在这种情况下会发生什么的文章。请看以下示例:

string s = "Potato";
string t = "Carrot, " + s + ", Bean";

在第二行中,编译器是否会将此优化为将一个字符串与Carrot添加到开头并将bean添加到结尾,或者它是否会为Carrot和Bean创建字符串,然后连接每个字符串以创建字符串?< / p>

我认为不同的编译器可能会以不同的方式运行,但一般来说这里会发生什么?

1 个答案:

答案 0 :(得分:8)

  

在第二行中,编译器是否会将此优化为将一个字符串与Carrot添加到开头并将bean添加到结尾,或者它是否会为Carrot和Bean创建字符串,然后连接每个字符串以创建字符串?< / p>

后者,因为s不是编译时常量表达式。如果您将s的声明更改为:

const string s = "Potato";

... 然后它将在编译时执行连接。您可以通过编译包含两个版本的代码来验证这一点,然后使用ildasm查看结果 - 在您的情况下,您会看到对string.Concat(string, string, string)的调用,而使用const string s我会在IL中看到已经连接的字符串。