C# 中 StringBuilder 类的作用是什么?
在 C# 中,字符串是不可变的。这意味着一旦创建了字符串,就不能修改它。对字符串的任何修改都会返回一个包含修改的新字符串,而原始字符串保持不变。
string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc
StringBuilder 类表示一个类似字符串的对象,可以对其进行修改,即一个可变的字符序列。它的实现方式与 string 类型不同,string 类型表示一个不可变的字符序列。
由于修改字符串对象会创建副本,因此重复修改字符串对象可能会导致性能下降。对于少量重复,这是可以忽略不计的,但对于大型循环,则可能非常显著。StringBuilder 提供了一种高效的替代方案来修改字符串,方法是追加、删除、替换或插入字符。
StringBuilder 保持一个内部缓冲区来保存字符。如果缓冲区中有可用空间,它会追加新数据。否则,它会创建一个新的缓冲区,将旧数据复制到新缓冲区,然后追加数据。
var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa
以下是构造 StringBuilder 对象的不同方法。
// Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity 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 − 将字符复制到目标 char span 或 char 数组。
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); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa // Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20); } }
输出
aaabbbccc aaadddccc aaaaaaaaaa