这篇文章对于字符串拼接做了详细的说明和测试.
总结如下:
如果你每次要拼接的字符串比较多,就用stringbuilder,
如果你每次拼接的字符串拼接的在5-6个以下,就可以用string.concat.比如
string.concat("1","1","1","1","1")
如果超过5-6个甚至更多的情况下就要用stringbuilder
var sb = new StringBuilder(100);
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
sb.Append("1");
想sb这种超过10个的拼接会比string.concat快几倍.越多快的越多.
还有一种情况就是内插写法
$"这是要{拼接}的{字符串}"
,内插写法会被编译为两种情况,一种是stringformat,一种是string.concat
如果你的内插写法里的变量是对象,而且你没有显示.ToString(),那么就会被编译为 stringformat,而这是最慢的一种拼接方式!!! 例如:
$"这是要{对象}的{i}"
如果你换一种写法
$"这是要{对象.ToString()}的{i.ToString()}"
这种就会被编译为string.concat.
上下两种的性能差好几倍!所以要特别注意,
比较坑的是VS会提示你简化去掉ToString(),所以要特别注意!!!!
当然.ToString()需要自己去重载重写
另外 params 关键字也尽可能不要用
一开始我嫌 StringBuilder 每个字符串都要写一行,又臭又长,所以想单独写个方法,然后传字符串进去,那这就要用到 params 关键字.
private string BuildeString(params string[] str)
{
foreach(var s in str)
SB.Append(s);
return SB.ToString();
}
但用了params之后就跟concat没什么区别了,因为concat就是用的params关键字来实现任意数量参数的.而直接 Append 才是最快的,当然写起来会很难看,因为一段完整的字符串可能会被拆分为十几行.例如:
var sb = new StringBuilder(100);
sb.Append("这是");
sb.Append(对象.ToString());
sb.Append("的");
sb.Append(字符串变量);
sb.Append("拼接结果");
所以具体用concat还是StringBuilder就看项目具体情况自己取舍了.