对于需要频繁修改字符串的场景,建议使用StringBuilder类以提升性能。

StringBuilder可以理解为可变的字符串。本质上,它是由多块字符串组成的动态缓冲区,而非像string那样每次修改都生成新的对象。

由于StringBuilder不会因为字符串的修改而重新分配内存,频繁修改字符串的场景下(例如日志记录、文本处理等)应优先考虑使用。

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 实例化 */
var stringBuilder = new StringBuilder("Hello"); // Hello

/* 向后添加一个字符串 */
stringBuilder.Append(" World!"); // Hello World!

/* 从索引为 1 的位置开始删除四个字符 */
stringBuilder.Remove(1, 4); // H World!

/* 在索引为 1 的位置后面插入 ello */
stringBuilder.Insert(1, "ello"); // Hello World!

/* 转换为 string 对象 */
string result = stringBuilder.ToString();

容量管理

StringBuilderCapacity属性控制其底层缓冲区的大小。与List<T>类似,StringBuilder的容量会在内容超过当前容量时扩容。

默认容量

StringBuilder默认初始容量为 16 字节。当添加的内容超过容量时,StringBuilder会自动扩容,一般是翻倍(16, 32, 64)。

也可以手动设置其初始容量,之后也会根据该初始容量翻倍。

1
2
3
4
5
6
7
var stringBuilder = new StringBuilder("Test");
stringBuilder.Capacity = 20;

for(int i=0; i<20; i++){
Console.WriteLine(stringBuilder.Capacity); // 容量从 20 最后扩展到 80
stringBuilder.Append("Test");
}

最大容量

可以在实例化StringBuilder时指定最大容量(maxCapacity)以限制其内存占用。如果超过最大容量,StringBuilder将抛出 ArgumentOutOfRangeException异常。

1
2
3
4
5
var stringBuilder = new StringBuilder(20, 40);  // 初始容量为 20,最大容量为 40

for(int i=0; i<20; i++){
stringBuilder.Append("Test"); // 超出最大容量时抛出异常
}