C#字符串怎么拼接才算高效
这个一个令人困扰的问题。有些人无论什么情况,都写一堆+。有些人貌似知道什么窍门,只用StringBuilder。 还有些人傻傻分不清。
为了搞清这个问题,看看下面这些语句有什么不同?
string a = "this is" + "a"
调用:string.concat(string,string)
string a = "this is" + "a" + ","
调用:string.concat(string,string,string)
string a = "this is" + "a" + "," + "b"
调用:string.concat(string,string,string,string)
以上三个重载方法是优化版本,效率不低于stringbuilder。当然,仅仅是在执行次数较少的情况下。
对比如下代码:
int verylargenumber = 1000000;
string a;
for (int i=0;i<verylargenumber;)
{
a += "x" + "y" + "z";
}
----
stringbuilder b;
for (int i=0;i<verylargenumber;)
{
b.append("x");
b.append("y");
b.append("z");
}
a = b.ToString();
前者是要大大输给后者的,因为内部有非常多次的申请内存和拷贝。
另外,用(+)来做连接,尽量不要用多条语句,而是放在一条语句中。
string a = "this is" + "a" + "," + "b" + "," + "c"
调用:string.concat(params[] values)。
超过4个字符串时,采用了另一个重载方法。内部额外的开销是创建了一份values的数组拷贝。多个字符串写在一行连接和用sb多次append进行连接效率差别不大。
List<string> d = ["this is", "a",",","b",",","c"];
string a = string.concat(d);
调用:string.concat(IEnumerable<string>)。
这个重载方法,内部使用了StringBuilder。当需要添加的字符串个数不确定时,平均性能最佳当然是StringBuilder。
class X
{
const string = "what " + " would " + " happen";
}
这里什么函数也不会调用,编译器知道都是纯字符串,会直接生成最终的字符串。所以不要自作聪明的写一个函数来初始化。
至于在多次迭代的情况下,为什么StringBuilder优于(+),这个以后再写。