Использование класса StringBuilder в .NET

Объект String является неизменяемым. Каждый раз при использовании одного из методов в классе System.String вы создаете объект строки в памяти, для которого требуется выделение нового пространства. В случаях, когда необходимо выполнять повторяющиеся изменения строки, издержки, связанные с созданием объекта String, могут оказаться значительными. Чтобы изменять строку без создания нового объекта, можно использовать класс System.Text.StringBuilder. Например, использование класса StringBuilder может повысить производительность при соединении большого количества строк в цикле.

Импорт пространства имен System.Text

Класс StringBuilder находится в пространстве имен System.Text. Чтобы не указывать в коде полное имя типа, вы можете импортировать пространство имен System.Text:

using namespace System;
using namespace System::Text;
using System;
using System.Text;
Imports System.Text

Создание экземпляров объекта StringBuilder

Вы можете создать экземпляр класса StringBuilder путем инициализации переменной с помощью одного из перегруженных методов конструктора, как показано в следующем примере.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
Dim myStringBuilder As New StringBuilder("Hello World!")

Настройка емкости и длины

Хотя StringBuilder является динамическим объектом, который позволяет вам развернуть ряд символов в строке, которые она инкапсулирует, вы можете указать максимальное число содержащихся в ней символов. Это значение называется емкостью объекта, и его не следует путать с длиной строки, которую содержит текущий объект StringBuilder. Например, вы можете создать экземпляр класса StringBuilder со строкой Hello, длина которой составляет 5 символов, указав при этом максимальную емкость объекта 25 символов. При изменении значения StringBuilder размер не перераспределяется, если не достигнута максимальная емкость. Когда это происходит, новое пространство выделяется автоматически, а емкость удваивается. Вы можете указать емкость класса StringBuilder с помощью одного из перегруженных конструкторов. В следующем примере показано, что объект myStringBuilder можно развернуть максимум на 25 позиций.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25);
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);
Dim myStringBuilder As New StringBuilder("Hello World!", 25)

Кроме того, вы можете использовать доступное для чтения или записи свойство Capacity, чтобы задать максимальную длину объекта. В следующем примере используется свойство Capacity для определения максимальной длины объекта.

myStringBuilder->Capacity = 25;
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 = gcnew StringBuilder("Hello World!");
myStringBuilder->Append(" What a beautiful day.");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.
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 для одного или нескольких форматируемых объектов. Следовательно, он принимает строки стандартного формата для числовых значений, значений даты и времени, значений перечисления, строки пользовательского формата для чисел и дат и строки формата, определенные для пользовательских типов. (Сведения о форматировании см. в разделе Форматирование типов.) Этот метод можно использовать для настройки формата переменных и добавления этих значений в .StringBuilder В следующем примере метод AppendFormat помещает в конец объекта StringBuilder целочисленное значение, отформатированное в виде значения валюты.

int MyInt = 25;
StringBuilder^ myStringBuilder = gcnew StringBuilder("Your total is ");
myStringBuilder->AppendFormat("{0:C} ", MyInt);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Your total is $25.00
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

Метод Insert добавляет строку или объект в указанную позицию в текущем объекте StringBuilder. В следующем примере этот метод вставляет слово в шестую позицию объекта StringBuilder.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Insert(6,"Beautiful ");
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!
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 = gcnew StringBuilder("Hello World!");
myStringBuilder->Remove(5,7);
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello
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

Метод Replace можно использовать для замены символов в объекте StringBuilder другими указанными символами. В следующем примере метод Replace находит все экземпляры восклицательного знака (!) в объекте StringBuilder и заменяет их знаками вопроса (?).

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!");
myStringBuilder->Replace('!', '?');
Console::WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?
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

См. также