C#中string和StringBuilder的选择
很多地方都讲,在做字符串拼接的时候StringBuilder比string快,并且快得多。
事实是,StringBuilder比string快的原因是string拼接时产生了中间对象,最终是垃圾。
如:
string str = "a";
str += "b";
str += "c";
那么,最终结果是"abc",但第二行产生了"ab"只是一个中间对象,是个垃圾。用StringBuilder会避免这种中间对象的产生。
那如果我这么写呢?
string str = "a"
+ "b"
+ "c";
这会比StringBuilder慢吗?绝对不会!
且不说这种常量的字符串拼接会在编译时就进行处理,就算"b"和"c"这里不是常量是变量,那么编译结果也是string.concat(...),不会产生中间对象。
当然,这样把多个语句变成了一个语句,有个缺点就是调试的时候没那么方便。
不是所有时候都可以方便的转换成连加,比如遇到if、while等语句块时。
用StringBuilder的目的是为了不产生中间变量,但如果这么用:
stringbuilder.Append("a"+str1+"b"),就还是产生了中间变量:"a"+str1+"b",应该改成
stringbuilder.Append("a").Append(str1).Append("b"),性能会更好,但可读性就差点了。