C# 中 StringBuilder 类的用途是什么?

在 C# 中,字符串是不可变的。这意味着一旦创建字符串,您就无法修改它。对字符串的任何修改都会返回一个包含修改的新字符串,而原始字符串保持不变。

string word = "aaabbbccc";
string newWord = word.Replace('b', 'd');
Console.WriteLine(word); // 打印 aaabbbccc
Console.WriteLine(newWord); // prints aaadddccc

StringBuilder 类表示可以修改的类似字符串的对象,即可变字符串。它的实现方式与 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 属性的值。之后,不能为该对象分配更多内存。如果您尝试向对象添加更多数据,它会抛出ArgumentOutOfRangeExceptionOutOfMemoryException异常。

StringBuilder 提供了以下方法可以轻松修改字符串。

  • Append - 将指定对象的字符串表示形式附加到此实例。

  • AppendFormat - 将通过处理包含零个或多个格式项的复合格式字符串返回的字符串附加到此实例。每个格式项都被相应对象参数的字符串表示替换。

  • AppendJoin - 连接提供的对象数组中元素的字符串表示,在每个成员之间使用指定的分隔符,然后将结果附加到字符串构建器的当前实例。

  • AppendLine - 将默认行终止符附加到当前 StringBuilder 对象的末尾。

  • Clear - 从当前 StringBuilder 实例中删除所有字符。

  • CopyTo - 将字符复制到目标字符范围或字符数组。

  • 的ensureCapacity -确保的StringBuilder的此实例的容量至少为指定值。

  • Equals - 如果此实例和提供的实例具有相等的字符串、容量和 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); // 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