假设我有以下字符串常量:
const string constString1 = "Const String 1";
const string constString2 = "Const String 2";
const string constString3 = "Const String 3";
const string constString4 = "Const String 4";
现在我可以用两种方式追加字符串: 选项1:
string resultString = constString1 + constString2 + constString3 + constString4;
选项2:
string resultString = string.Format("{0}{1}{2}{3}",constString1,constString2,constString3,constString4);
内部string.Format使用StringBuilder.AppendFormat。现在假设我附加了常量字符串,哪个选项(option1或选项2)在性能和/或内存方面更好?
答案 0 :(得分:11)
第一个将由编译器(至少是Microsoft C#编译器)完成(与编译器执行1 + 2的方式相同),第二个必须在运行时完成。很明显,第一个更快。
作为一个额外的好处,在第一个字符串内部化,在第二个字符串中它不是。
String.Format很慢:-)(读这个
http://msmvps.com/blogs/jon_skeet/archive/2008/10/06/formatting-strings.aspx)。不要“慢到成为一个问题”,除非您的所有程序一整天都是格式字符串(数百万个,而不是TENS)。然后你可以更快Append
将它们变成StringBuilder
。
答案 1 :(得分:1)
第一个变体是最好的,但只有在使用常量字符串时。
这里有两个编译器优化(来自C#编译器,而不是JIT编译器)。让我们举一个程序的例子
const string A = "Hello ";
const string B = "World";
...
string test = A + B;
第一个优化是持续传播,它会将您的代码基本上改为:
string test = "Hello " + "World";
然后,文字字符串的串联(因为它们现在,由于第一次优化)优化将启动并将其更改为
string test = "Hello World";
因此,如果您编写上面显示的程序的任何变体,由于C#编译器的优化,实际的IL将是相同的(或至少非常相似)。