1. 使用StringBuilder的好处
由于string对象是不可更改的,我们每次使用string类的方法时,都会在内存中重新创建一个新的string对象,这时候就要为该对象分配内存空间了。如果在一段代码中,频繁执行string类的方法来修改字符串对象,那么内存消耗就会很大。例如,在一个循环中,频繁地进行字符串拼接的操作,假如这个循环执行多次,那么每次拼接字符串所产生的字符串将会吃掉很多内存空间。所以,为了提升程序的性能,在需要修改字符串而不要重新创建字符串的时候,我们采用System.Text.StringBuilder类来处理。
StringBuilder是用来保存可变的字符串的容器,是动态的字符串对象。
2. 创建StringBuilder
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder(); //设置StringBuilder对象的最大容量
StringBuilder s3 = new StringBuilder("abcdef");
3. StringBuilder的特点
1. 对象的容量有大小
可容纳的最大字符数是可以改变的,可以通过设置Capacity属性来改变。在没有达到容量前,它不会自动重新分配空间;当达到容量时,将自动分配新的空间且容量翻倍。
EnsureCapacity 方法可用来检查当前 StringBuilder 的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。
2. 保存的字符串的大小
所容纳的字符串的长度是Length属性,也可以查看或设置 Length 属性。如果将 Length 属性设置为大于 Capacity 属性的值,则自动将 Capacity 属性更改为与 Length 属性相同的值。如果将 Length 属性设置为小于当前 StringBuilder 对象内的字符串长度的值,则会缩短该字符串。
3. 可以使用ToString()将缓冲区数据转换为字符串
4. StringBuilder的常用方法
(1)Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。以下示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
StringBuilder strBuilder = new StringBuilder("Hello World.");
strBuilder.Append(" I Love China."); //输出: Hello World. I Love China.
strBuilder.Append("").Append(""); //输出: Hello World. I Love China.123456
(2)AppendFormat 方法将文本添加到 StringBuilder 的结尾处,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法将一个设置为货币值格式的整数值放置到 StringBuilder 的结尾。
int MyCash = ;
StringBuilder MyStringBuilder = new StringBuilder("Your total is ");
MyStringBuilder.AppendFormat("{0:C} ", MyCash);
Console.WriteLine(MyStringBuilder);// Your total is $200.00
(3)Insert 方法将字符串或对象添加到当前 StringBuilder 中的指定位置。以下示例使用此方法将一个单词插入到 StringBuilder 的第六个位置。
StringBuilder strBuilder1 = new StringBuilder("Hello World.");
strBuilder1.Insert(, "Beautiful");
Console.WriteLine(strBuilder1);//Hello Beautiful World.
(4)Remove 可以使用 Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用 Remove 方法缩短 StringBuilder。
StringBuilder strBiulder2 = new StringBuilder("Hello World!");
strBiulder2.Remove(, );
Console.WriteLine(strBiulder2);// Hello
(5)Replace 使用 Replace 方法,可以用另一个指定的字符来替换 StringBuilder 对象内的字符。以下示例使用 Replace 方法来搜索 StringBuilder 对象,查找所有的感叹号字符 (!),并用问号字符 (?) 来替换它们。
StringBuilder strBuilder3 = new StringBuilder("Hello World!");
strBuilder3.Replace('!', '?');
Console.WriteLine(strBuilder3);//Hello World?
4. StringBuilder VS String
在操作性能和内存效率方面,StringBuilder要比String好得多,可以避免产生太多的临时字符串对象,特别是对于经常重复进行修改的情况更是如此。而另一方面,String类提供了更多的方法,可以使开发能够更快地实现应用。
在两者的选择上,如果应用对于系统性能、内存要求比较严格,以及经常处理大规模的字符串,推荐使用StringBuilder对象;例如,在对数据库进行操作的时候,我们需要频繁地拼接SQL语句。否则,可以选择使用String。