char数组, 作为一个数组对象, 它在内存中是不可改变的, 调用str.Trim(), str.Upper(), str.Lower()方法, 其实在内存中都是在创建一个新的字符串对象, 使用str1 += str2这样的句子, 看起来是str1的长度变了, 其实在内存中是分配乐新的连续的地址空间, 产生乐一个新的str3, 长度是str1和str2的和, 然后str1的指针, 指向乐str3, 在只是对字符串进行修改的情况下, 实质却是分配乐新的对象, 这种系统开销, 尤其是在做循环的时候, 代价是很昂贵的.
所以就有乐StringBuilder对象, 如果只是修改字符串的内容而不是要创建新字符串, 使用StringBuilder再合适没有, 尤其是那种循环附加字符串的场合里, 使用StringBuilder更是天造地设.
StringBuilder是动态的, 从本质上说, 它其实是一个链表, 也就是说, 它的地址空间不是连续的, StringBuilder失去乐String对象的很多方法, 但是从使用上说, StringBuilder在构造字符串的优异性能, 弥补乐它的这方面的不足.
我们可能经常这么写代码:
// url是个String
+ "/dir1/url1.aspx?fid="
+ str1
+ "&mode="
+ str2
...;
其实我们应该这么写:
// urlBuilder是个StringBuilder
"{0}//dir1/url1.aspx"
+ "?fid={1}&mode={2}...",
Request.ApplicationPath,
str1,
str2,
...
);
String url = urlBuilder.ToString();
不过, 我们要是只是对字符串进行少量简单的修改操作, 还不至于用上StringBuilder对象, 毕竟一个对象要是能力更大, 也就会更复杂, 更占内存, 有时候使用StringBuilder这把牛刀来杀鸡, 不免得不偿失. 但是, 要是对字符串进行大量的修改操作, 朋友, 我还是信赖StringBuilder, 呵呵.