对象 String 是不可变的。 每次在类中使用 System.String 其中一种方法时,都会在内存中创建新的字符串对象,这需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新 String 对象相关的开销可能成本高昂。 如果要在不创建新对象的情况下修改字符串,可以使用该 System.Text.StringBuilder 类。 例如,在循环中将多个字符串串联在一起时,使用 StringBuilder 类可以提高性能。
导入 System.Text 命名空间
该 StringBuilder 类位于命名空间中 System.Text 。 若要避免在代码中提供完全限定的类型名称,可以导入 System.Text 命名空间:
using System;
using System.Text;
Imports System.Text
实例化 StringBuilder 对象
可以通过使用重载构造函数方法之一初始化变量来创建新的类实例 StringBuilder ,如以下示例所示。
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")
设置容量和长度
StringBuilder尽管动态对象允许扩展它封装的字符串中的字符数,但可以为它可保存的最大字符数指定一个值。 此值称为对象的容量,不应与当前 StringBuilder 保留的字符串的长度混淆。 例如,可以使用字符串“Hello”创建类的新实例 StringBuilder ,该字符串的长度为 5,并且可以指定该对象的最大容量为 25。 修改 StringBuilder 时,除非达到容量,否则对象不会为自己重新分配空间。 发生这种情况时,会自动分配新空间,容量将翻倍。 可以使用其中一个重载的构造函数来指定 StringBuilder 类的容量。 以下示例指定 myStringBuilder
对象可以扩展到最多 25 个空格。
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)
此外,可以使用读/写 Capacity 属性设置对象的最大长度。 以下示例使用 Capacity 属性定义最大对象长度。
myStringBuilder.Capacity = 25;
myStringBuilder.Capacity = 25
该方法 EnsureCapacity 可用于检查当前 StringBuilder 的容量。 如果容量大于传递的值,则不进行更改;但是,如果容量小于传递的值,则当前容量将更改为匹配传递的值。
也可以查看或设置该 Length 属性。 如果将 Length 属性设置为大于 Capacity 属性的值, 则 Capacity 属性将自动更改为与 Length 属性相同的值。 将 Length 属性设置为小于当前 StringBuilder 中字符串长度的值会缩短字符串。
修改 StringBuilder 字符串
下表列出了可用于修改 StringBuilder 内容的方法。
方法名称 | 使用 |
---|---|
StringBuilder.Append | 将信息追加到当前 StringBuilder 的末尾。 |
StringBuilder.AppendFormat | 将字符串中传递的格式说明符替换为带格式的文本。 |
StringBuilder.Insert | 将字符串或对象插入当前 StringBuilder 的指定索引中。 |
StringBuilder.Remove | 从当前 StringBuilder 中删除指定数量的字符。 |
StringBuilder.Replace | 将当前StringBuilder中所有指定字符或字符串的出现替换为另一个指定的字符或字符串。 |
追加
Append 方法可用于将对象的文本或字符串表示形式添加到由当前 StringBuilder 表示的字符串的末尾。 以下示例将 StringBuilder 初始化为“Hello World”,然后将一些文本追加到对象的末尾。 根据需要自动分配空间。
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World! What a beautiful day.
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Append(" What a beautiful day.")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello World! What a beautiful day.
AppendFormat
StringBuilder.AppendFormat 方法将内容添加到 StringBuilder 对象的末尾。 它通过调用要格式化的对象或对象的实现来支持IFormattable。 因此,它接受数字、日期和时间和枚举值的标准格式字符串、数值和日期和时间值的自定义格式字符串,以及为自定义类型定义的格式字符串。 (有关格式设置的信息,请参阅 “格式设置类型”。)可以使用此方法自定义变量的格式,并将这些值追加到 a StringBuilder. 下面的示例使用 AppendFormat 方法,将格式为货币值的整数值添加到 StringBuilder 对象末尾。
int MyInt = 25;
StringBuilder myStringBuilder = new StringBuilder("Your total is ");
myStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Your total is $25.00
Dim MyInt As Integer = 25
Dim myStringBuilder As New StringBuilder("Your total is ")
myStringBuilder.AppendFormat("{0:C} ", MyInt)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Your total is $25.00
插入
该方法 Insert 将字符串或对象添加到当前 StringBuilder 对象中的指定位置。 下面的示例使用此方法将单词插入到对象的第六个 StringBuilder 位置。
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello Beautiful World!
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Insert(6, "Beautiful ")
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello Beautiful World!
删除
可以使用 Remove 方法从当前 StringBuilder 对象中删除指定数目的字符,从指定的从零开始的索引处开始。 以下示例使用 Remove 方法缩短对象 StringBuilder 。
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Remove(5,7);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Remove(5, 7)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello
将
Replace 方法可用于将对象中的StringBuilder字符替换为另一个指定字符。 以下示例使用 Replace 方法搜索 StringBuilder 感叹号字符(!)的所有实例的对象,并将其替换为问号字符(?)。
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Replace('!', '?');
Console.WriteLine(myStringBuilder);
// The example displays the following output:
// Hello World?
Dim myStringBuilder As New StringBuilder("Hello World!")
myStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(myStringBuilder)
' The example displays the following output:
' Hello World?
将 StringBuilder 对象转换为字符串
必须先将 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());
}
}
// The example displays the following output:
// Which of the following spellings is True:
// 0. recieve
// 1. receeve
// 2. receive
Imports System.Text
Module Example
Public Sub Main()
Dim sb As New StringBuilder()
Dim flag As Boolean = True
Dim spellings() As String = {"recieve", "receeve", "receive"}
sb.AppendFormat("Which of the following spellings is {0}:", flag)
sb.AppendLine()
For ctr As Integer = 0 To spellings.GetUpperBound(0)
sb.AppendFormat(" {0}. {1}", ctr, spellings(ctr))
sb.AppendLine()
Next
sb.AppendLine()
Console.WriteLine(sb.ToString())
End Sub
End Module
' The example displays the following output:
' Which of the following spellings is True:
' 0. recieve
' 1. receeve
' 2. receive