Поделиться через


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

Объект 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 . Например, можно создать новый экземпляр StringBuilder класса со строкой Hello, которая имеет длину 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 другим указанным символом или строкой.

Добавить

Метод Add можно использовать для добавления текста или строкового представления объекта в конец строки, представленной текущим 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 реализацию объекта или объектов для форматирования. Поэтому он принимает стандартные строки форматирования для числовых значений, дат и времени, а также значений перечисления, настраиваемые строки форматирования для числовых значений и значений дат и времени, а также строки форматирования, определенные для пользовательских типов. (Сведения о форматировании см. в разделе "Типы форматирования".) Этот метод можно использовать для настройки формата переменных и добавления этих значений в .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

См. также