在C#及.NET框架中使用StringBuilder类操作字符串的技巧
但如果性能的优劣很重要,则应该总是使用 stringbuilder 类来串联字符串。下面的代码使用 stringbuilder 类的 append 方法来串联字符串,因此不会有 + 运算符的链接作用产生。
class stringbuildertest { static void main() { string text = null; // use stringbuilder for concatenation in tight loops. system.text.stringbuilder sb = new system.text.stringbuilder(); for (int i = 0; i < 100; i++) { sb.appendline(i.tostring()); } system.console.writeline(sb.tostring()); // keep the console window open in debug mode. system.console.writeline("press any key to exit."); system.console.readkey(); } }
输出:
0 1 2 3 4 ...
在 .net framework 中使用 stringbuilder 类
string 对象是不可变的。每次使用 system.string 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 string 对象相关的系统开销可能会非常大。如果要修改字符串而不创建新的对象,则可以使用 system.text.stringbuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 stringbuilder 类可以提升性能。
实例化 stringbuilder 对象
通过用一个重载的构造函数方法初始化变量可以创建 stringbuilder 类的新实例,如下面的示例中所阐释的那样。
stringbuilder mystringbuilder = new stringbuilder("hello world!");
设置容量和长度
虽然 stringbuilder 是动态对象,允许扩充它所封装的字符串中的字符数,但您可以通过一个值来指定该对象可容纳的最大字符数。此值称为该对象的容量,不要将它与当前 stringbuilder 所容纳的字符串的长度相混淆。例如,可以使用长度为 5 的字符串“hello”创建 stringbuilder 类的一个新实例,同时可以指定该对象的最大容量为 25。当修改 stringbuilder 时,在达到容量之前,该对象不会为自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 stringbuilder 类的容量。下面的示例指定可以将 mystringbuilder 对象扩充到最大 25 个空白。
stringbuilder mystringbuilder = new stringbuilder("hello world!", 25);
另外,可以使用读/写 capacity 属性来设置对象的最大长度。下面的示例使用 capacity 属性来定义对象的最大长度。
mystringbuilder.capacity = 25;
ensurecapacity 方法可用来检查当前 stringbuilder 的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。
也可以查看或设置 length 属性。如果将 length 属性设置为大于 capacity 属性的值,则自动将 capacity 属性更改为与 length 属性相同的值。如果将 length 属性设置为小于当前 stringbuilder 对象内的字符串长度的值,则会缩短该字符串。
修改 stringbuilder 字符串
下面列出了可以用来修改 stringbuilder 的内容的方法:
1.stringbuilder.append
将信息追加到当前 stringbuilder 的结尾。
2.stringbuilder.appendformat
用带格式文本替换字符串中传递的格式说明符。
3.stringbuilder.insert
将字符串或对象插入到当前 stringbuilder 对象的指定索引处。
4.stringbuilder.remove
从当前 stringbuilder 对象中移除指定数量的字符。
5.stringbuilder.replace
替换指定索引处的指定字符。
1.append
append 方法可用来将文本或对象的字符串表示形式添加到由当前 stringbuilder 对象表示的字符串的结尾处。下面的示例将一个 stringbuilder 对象初始化为“hello world”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
stringbuilder mystringbuilder = new stringbuilder("hello world!"); mystringbuilder.append(" what a beautiful day."); console.writeline(mystringbuilder);
输出:
hello world! what a beautiful day.
2.appendformat
stringbuilder.appendformat 方法将文本添加到 stringbuilder 对象的结尾处。该方法通过调用要设置格式的对象的 iformattable 实现来支持复合格式设置功能(有关更多信息,请参见复合格式设置)。因此,它接受数字、日期和时间以及枚举值的标准格式字符串、数字以及日期和时间值的自定义格式字符串,以及为自定义类型定义的格式字符串。(有关格式设置的信息,请参见.net framework 中的格式化类型。)可以使用此方法来自定义变量的格式并将这些值追加到 stringbuilder 的后面。下面的示例使用 appendformat 方法,将一个设置为货币值格式的整数值放到 stringbuilder 对象的末尾。
int myint = 25; stringbuilder mystringbuilder = new stringbuilder("your total is "); mystringbuilder.appendformat("{0:c} ", myint); console.writeline(mystringbuilder);
输出:
your total is $25.00
3.insert
insert 方法将字符串或对象添加到当前 stringbuilder 对象中的指定位置。下面的示例使用此方法将一个单词插入到 stringbuilder 对象的第六个位置。
stringbuilder mystringbuilder = new stringbuilder("hello world!"); mystringbuilder.insert(6,"beautiful "); console.writeline(mystringbuilder);
输出:
hello beautiful world!
4.移除
可以使用 remove 方法从当前 stringbuilder 对象中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。下面的示例使用 remove 方法缩短 stringbuilder 对象。
stringbuilder mystringbuilder = new stringbuilder("hello world!"); mystringbuilder.remove(5,7); console.writeline(mystringbuilder);
输出:
hello
5.replace
使用 replace 方法可以用另一个指定的字符来替换 stringbuilder 对象内的字符。下面的示例使用 replace 方法在 stringbuilder 对象中搜索感叹号字符 (!) 的所有实例,并将其替换为问号字符 (?)。
stringbuilder mystringbuilder = new stringbuilder("hello world!"); mystringbuilder.replace('!', '?'); console.writeline(mystringbuilder);
输出:
hello world?
将 stringbuilder 对象转换为 string
必须先将 stringbuilder 对象转换为 string 对象,然后才能将 stringbuilder 对象表示的字符串传递给具有 string 参数的方法并在用户界面中显示它。可通过调用 stringbuilder.tostring 方法来执行此转换。下面的示例调用许多 stringbuilder 方法,然后调用 stringbuilder.tostring() 方法来显示字符串。
using system; using system.text; public class example { public static void main() { stringbuilder sb = new stringbuilder(); bool flag = true; string[] spellings = { "recieve", "receeve", "receive" }; sb.appendformat("which of the following spellings is {0}:", flag); sb.appendline(); for (int ctr = 0; ctr <= spellings.getupperbound(0); ctr++) { sb.appendformat(" {0}. {1}", ctr, spellings[ctr]); sb.appendline(); } sb.appendline(); console.writeline(sb.tostring()); } }
输出:
which of the following spellings is true: 0. recieve 1. receeve 2. receive