C# 中 StringBuilder 类的用途是什么?
在 C# 中,字符串是不可变的。这意味着一旦创建字符串,就无法修改它。对字符串的任何修改都会返回一个包含修改内容的新字符串,原始字符串保持不变。
string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // 输出 aaabbbccc
Console.WriteLine(newWord); // 输出 aaadddccc
StringBuilder 类表示一个可修改的类字符串对象,即一个可变的字符串。它的实现方式与字符串类型不同,后者表示不可变的字符串。
由于修改字符串对象会创建副本,因此反复修改字符串对象可能会导致性能损失。对于小规模的重复操作,这种影响可以忽略不计,但对于大型循环来说,影响可能非常显著。StringBuilder 提供了一种高效的替代方案,可以通过添加、移除、替换或插入字符来修改字符串。
StringBuilder 维护一个内部缓冲区来保存字符。如果缓冲区中有可用空间,它会附加新数据。否则,它会创建一个新缓冲区,将旧数据复制到新缓冲区,然后附加数据。
var sb = new StringBuilder();
for (int i = 0; i < 10; i++){
sb.Append("a");
}
Console.WriteLine(sb.ToString()); // 打印 aaaaaaaaaa
以下是构造 StringBuilder 对象的几种不同方法。
// 初始化一个新的 StringBuilder 实例 var sb1 = new StringBuilder(); // 使用给定的容量初始化一个新的 StringBuilder 实例 var sb2 = new StringBuilder(capacity: 10); // 使用给定的字符串初始化一个新的 StringBuilder 实例 var sb3 = new StringBuilder(value: "Hello World"); // 使用给定的容量及其最大容量初始化一个新的 StringBuilder 实例 var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10); // 使用给定的字符串和容量初始化一个新的 StringBuilder 实例 var sb5 = new StringBuilder(value: "Hello", capacity: 20); // 使用给定的子字符串和容量初始化一个新的 StringBuilder 实例 var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
StringBuilder 类具有 Length 属性,用于指示对象当前的字符数。随着向对象添加更多字符,其长度会增加,直至达到其容量(容量定义了对象当前可以包含的最大字符数)。
如果添加的字符数导致长度超出其当前容量,该类将分配新的内存,并将其容量与其容量匹配。然后将新字符添加到对象中,并调整其 Length 属性。
StringBuilder 会持续动态添加额外内存,直到达到 MaxCapacity 属性的值。超过该值后,将无法再为该对象分配内存。如果您尝试向对象添加更多数据,它会抛出 ArgumentOutOfRangeException 或 OutOfMemoryException 异常。
StringBuilder 提供以下方法,可轻松修改字符串。
Append − 将指定对象的字符串表示形式附加到此实例。
AppendFormat −将处理复合格式字符串(包含零个或多个格式项)返回的字符串附加到此实例。每个格式项将被相应对象参数的字符串表示形式替换。
AppendJoin − 使用指定的分隔符连接所提供对象数组中元素的字符串表示形式,并将结果附加到字符串构建器的当前实例。
AppendLine − 将默认行终止符附加到当前 StringBuilder 对象的末尾。
Clear − 从当前 StringBuilder 实例中删除所有字符。
CopyTo −将字符复制到目标字符范围或字符数组。
EnsureCapacity − 确保此 StringBuilder 实例的容量至少为指定值。
Equals − 如果此实例和提供的实例具有相等的字符串、Capacity 和 MaxCapacity 值,则返回 true。
GetChunks − 返回一个可用于迭代字符块的对象。
Insert − 将指定对象的字符串表示形式插入到此实例的指定字符位置。
Remove − 从此实例中删除指定范围的字符。
Replace −将此实例中所有出现的指定字符或字符串替换为另一个指定的字符或字符串。
ToString − 将当前实例转换为字符串。
示例
using System;
using System.Text;
class Program{
static void Main(string[] args){
string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // 打印 aaabbbccc
Console.WriteLine(newWord); // 打印 aaadddccc
var sb = new StringBuilder();
for (int i = 0; i < 10; i++){
sb.Append("a");
}
Console.WriteLine(sb.ToString()); // 打印 aaaaaaaaaa
// 初始化 StringBuilder 的新实例
var sb1 = new StringBuilder();
// 使用给定的容量初始化 StringBuilder 的新实例
var sb2 = new StringBuilder(capacity: 10);
// 使用给定的字符串初始化 StringBuilder 的新实例
var sb3 = new StringBuilder(value: "Hello World";);
// 使用给定的容量和 初始化 StringBuilder 的新实例 可增长到的最大容量
var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50);
// 使用给定的字符串和容量初始化一个新的 StringBuilder 实例
var sb5 = new StringBuilder(value: "Hello";, capacity: 20);
// 使用给定的子字符串和容量初始化一个新的 StringBuilder 实例
var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
}
}
输出
aaabbbccc aaadddccc aaaaaaaaaa

