Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Класс StringBuilder

 

Опубликовано: Октябрь 2016

Предоставляет изменяемую строку символов. Этот класс не наследуется.

Просмотреть исходный код .NET Framework для этого типа Reference Source.

Пространство имен:   System.Text
Сборка:  mscorlib (в mscorlib.dll)


[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable

ИмяОписание
System_CAPS_pubmethodStringBuilder()

Инициализирует новый экземпляр класса StringBuilder.

System_CAPS_pubmethodStringBuilder(Int32)

Инициализирует новый экземпляр класса StringBuilder, используя указанную емкость.

System_CAPS_pubmethodStringBuilder(Int32, Int32)

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

System_CAPS_pubmethodStringBuilder(String)

Инициализирует новый экземпляр класса StringBuilder, используя указанную строку.

System_CAPS_pubmethodStringBuilder(String, Int32)

Инициализирует новый экземпляр класса StringBuilder, используя указанную строку и емкость.

System_CAPS_pubmethodStringBuilder(String, Int32, Int32, Int32)

Инициализирует новый экземпляр класса StringBuilder из указанной подстроки и емкости.

ИмяОписание
System_CAPS_pubpropertyCapacity

Возвращает или задает максимальное число знаков, которое может содержаться в памяти, назначенной текущим экземпляром.

System_CAPS_pubpropertyChars[Int32]

Возвращает или задает символ на указанной позиции в данном экземпляре.

System_CAPS_pubpropertyLength

Возвращает или задает длину текущего объекта StringBuilder.

System_CAPS_pubpropertyMaxCapacity

Возвращает максимальную емкость данного экземпляра.

ИмяОписание
System_CAPS_pubmethodAppend(Boolean)

Добавляет строковое представление указанного логического значения к данному экземпляру.

System_CAPS_pubmethodAppend(Byte)

Добавляет строковое представление указанного 8-разрядного целого числа без знака к данному экземпляру.

System_CAPS_pubmethodAppend(Char)

Добавляет строковое представление указанного объекта Char в данный экземпляр.

System_CAPS_pubmethodAppend(Char*, Int32)

Добавляет к данному экземпляру массив символов Юникода начиная с указанного адреса.

System_CAPS_pubmethodAppend(Char, Int32)

Добавляет указанное число копий строкового представления символа Юникода к данному экземпляру.

System_CAPS_pubmethodAppend(Char[])

Добавляет строковое представление символа Юникода в указанном массиве к данному экземпляру.

System_CAPS_pubmethodAppend(Char[], Int32, Int32)

Добавляет строковое представление указанного дочернего массива символов Юникода к данному экземпляру.

System_CAPS_pubmethodAppend(Decimal)

Добавляет строковое представление указанного десятичного числа к данному экземпляру.

System_CAPS_pubmethodAppend(Double)

Добавляет строковое представление указанного числа с плавающей запятой с удвоенной точностью к данному экземпляру.

System_CAPS_pubmethodAppend(Int16)

Добавляет строковое представление указанного 16-разрядного целого числа со знаком к данному экземпляру.

System_CAPS_pubmethodAppend(Int32)

Добавляет строковое представление указанного 32-разрядного целого числа со знаком к данному экземпляру.

System_CAPS_pubmethodAppend(Int64)

Добавляет строковое представление указанного 64-разрядного целого числа со знаком к данному экземпляру.

System_CAPS_pubmethodAppend(Object)

Добавляет строковое представление указанного объекта к данному экземпляру.

System_CAPS_pubmethodAppend(SByte)

Добавляет строковое представление указанного 8-разрядного целого числа со знаком к данному экземпляру.

System_CAPS_pubmethodAppend(Single)

Добавляет строковое представление указанного числа с плавающей запятой с обычной точностью к данному экземпляру.

System_CAPS_pubmethodAppend(String)

Добавляет копию указанной строки к данному экземпляру.

System_CAPS_pubmethodAppend(String, Int32, Int32)

Добавляет копию указанной подстроки к данному экземпляру.

System_CAPS_pubmethodAppend(UInt16)

Добавляет строковое представление указанного 16-разрядного целого числа без знака к данному экземпляру.

System_CAPS_pubmethodAppend(UInt32)

Добавляет строковое представление указанного 32-разрядного целого числа без знака к данному экземпляру.

System_CAPS_pubmethodAppend(UInt64)

Добавляет строковое представление указанного 64-разрядного целого числа без знака к данному экземпляру.

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object)

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

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object, Object)

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

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object, Object, Object)

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

System_CAPS_pubmethodAppendFormat(IFormatProvider, String, Object[])

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

System_CAPS_pubmethodAppendFormat(String, Object)

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

System_CAPS_pubmethodAppendFormat(String, Object, Object)

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

System_CAPS_pubmethodAppendFormat(String, Object, Object, Object)

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

System_CAPS_pubmethodAppendFormat(String, Object[])

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

System_CAPS_pubmethodAppendLine()

Добавляет знак завершения строки по умолчанию в конец текущего объекта StringBuilder.

System_CAPS_pubmethodAppendLine(String)

Добавляет копию указанной строки и знак завершения строки по умолчанию в конец текущего объекта StringBuilder.

System_CAPS_pubmethodClear()

Удаляет все символы из текущего экземпляра StringBuilder.

System_CAPS_pubmethodCopyTo(Int32, Char[], Int32, Int32)

Копирует символы из указанного сегмента этого экземпляра в указанный массив Char.

System_CAPS_pubmethodEnsureCapacity(Int32)

Гарантирует, что емкость данного экземпляра StringBuilder не меньше указанного значения.

System_CAPS_pubmethodEquals(Object)

Определяет, равен ли заданный объект текущему объекту.(Наследуется от Object.)

System_CAPS_pubmethodEquals(StringBuilder)

Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту.

System_CAPS_pubmethodGetHashCode()

Служит хэш-функцией по умолчанию.(Наследуется от Object.)

System_CAPS_pubmethodGetType()

Возвращает объект Type для текущего экземпляра.(Наследуется от Object.)

System_CAPS_pubmethodInsert(Int32, Boolean)

Вставляет строковое представление логического значения в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Byte)

Вставляет строковое представление указанного 8-разрядного целого числа без знака в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Char)

Вставляет строковое представление указанного символа Юникода в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Char[])

Вставляет строковое представление указанного массива символов Юникода в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Char[], Int32, Int32)

Вставляет строковое представление указанного подмассива символов Юникода в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Decimal)

Вставляет строковое представление десятичного числа в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Double)

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

System_CAPS_pubmethodInsert(Int32, Int16)

Вставляет строковое представление указанного 16-разрядного знакового целого числа в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Int32)

Вставляет строковое представление указанного 32-разрядного знакового целого числа в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Int64)

Вставляет строковое представление 64-разрядного знакового целого числа в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Object)

Вставляет строковое представление объекта в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, SByte)

Вставляет строковое представление указанного 8-разрядного знакового целого числа в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, Single)

Вставляет строковое представление числа одинарной точности с плавающей запятой с обычной точностью в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, String)

Вставляет строку в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, String, Int32)

Вставляет одну или более копий указанной строки в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, UInt16)

Вставляет строковое представление 16-разрядного целого числа без знака в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, UInt32)

Вставляет строковое представление 32-разрядного целого числа без знака в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodInsert(Int32, UInt64)

Вставляет строковое представление 64-разрядного целого числа без знака в данный экземпляр на указанную позицию символа.

System_CAPS_pubmethodRemove(Int32, Int32)

Удаляет указанный диапазон символов из данного экземпляра.

System_CAPS_pubmethodReplace(Char, Char)

Замещает все вхождения указанного символа в данном экземпляре на другой указанный знак.

System_CAPS_pubmethodReplace(Char, Char, Int32, Int32)

Замещает все вхождения указанного символа в подстроке данного экземпляра на другой указанный символ.

System_CAPS_pubmethodReplace(String, String)

Замещает все вхождения указанной строки в данном экземпляре на другую указанную строку.

System_CAPS_pubmethodReplace(String, String, Int32, Int32)

Замещает все вхождения указанной строки в подстроке данного экземпляра на другую указанную строку.

System_CAPS_pubmethodToString()

Преобразует значение данного экземпляра в String.(Переопределяет Object.ToString().)

System_CAPS_pubmethodToString(Int32, Int32)

Преобразует значение подстроки этого экземпляра в String.

ИмяОписание
System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable.GetObjectData(SerializationInfo, StreamingContext)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Заполняет объект System.Runtime.Serialization.SerializationInfo данными даты, необходимыми для десериализации текущего объекта StringBuilder.

System_CAPS_noteПримечание

Чтобы просмотреть исходный код .NET Framework для этого типа, см. раздел Reference Source. Просмотр исходного кода в Интернете, загружаемом справочнике для автономного просмотра и пошагово источники (включая исправления и обновления) во время отладки; see instructions.

Этот класс представляет объект строкового типа, значение которого является изменяемой последовательностью символов.

Содержание

Хотя StringBuilder и String оба представляют последовательность символов, они реализуются по-разному. String является неизменяемым типом. То есть для каждой операции, которая отображается для изменения String объект фактически создает новую строку.

Например, вызов String.Concat метод в следующем примере C#, по-видимому, измените значение строковой переменной с именем value. На самом деле Concat возвращает метод value объекта, имеющего другое значение и адрес из value объектом, переданным методу. Обратите внимание, что пример, должны компилироваться с помощью /unsafe параметр компилятора.

using System;

public class Example
{
   public unsafe static void Main()
   {
      string value = "This is the first sentence" + ".";
      fixed (char* start = value)
      {
         value = String.Concat(value, "This is the second sentence. ");
         fixed (char* current = value)
         {
            Console.WriteLine(start == current);
         }
      }   
   }
}
// The example displays the following output:
//      False

Для подпрограмм, выполняющих обширные строками (например, приложения, изменяющие строку несколько раз в цикле) несколько раз изменения строки можно точное к значительному снижению производительности. Альтернативой является использование StringBuilder, которое является классом изменяемую строку. Изменяемость означает, что после создания экземпляра класса, его можно изменить путем добавления, удаления, замены или вставки знаков. Объект StringBuilder объект поддерживает буфер, в соответствии с их развертывание в строку. Новые данные добавляются в буфер, если доступно места; в противном случае — выделяется новый, больший буфер, данные из исходного буфера копируются в новый буфер, и новые данные затем добавляются в новый буфер.

System_CAPS_importantВажно

Хотя StringBuilder класса обычно обеспечивает лучшую производительность, чем String класс, вы не заменяют автоматически String с StringBuilder каждый раз, когда требуется для работы со строками. Производительность зависит от размера строки, объем памяти, выделяемой для новой строки, системы, на котором выполняется приложение и тип операции. Следует быть готовым протестировать приложение, чтобы определить, является ли StringBuilder действительно предлагает значительное улучшение производительности.

Рассмотрите возможность использования String класса при следующих условиях:

  • Число изменений, делают приложение в строку при небольших. В этих случаях StringBuilder может незначительно предложения или улучшение производительности по String.

  • При выполнении операции объединения, особенно со строковыми литералами фиксированное число. В этом случае компилятор может потребоваться объединение операций объединения в одной операции.

  • При необходимости вести расширенный поиск при создании строки. StringBuilder Отсутствует класс поиска методов, таких как IndexOf или StartsWith. Вам придется преобразовать StringBuilder объект String для этих операций и это могут снизить производительность с помощью StringBuilder. Дополнительные сведения см. в разделе Поиск текста в объект StringBuilder раздел.

Рассмотрите возможность использования StringBuilder класса при следующих условиях:

  • Если предполагается, что приложение, чтобы повысить неизвестное количество изменений в строку во время разработки (например, при использовании цикла для сцепления случайное число строк, содержащих ввод данных пользователем).

  • Если предполагается, что приложение, чтобы повысить значительное количество изменений в строку.

StringBuilder.Length Указывает число символов StringBuilder в настоящее время содержит объект. При добавлении символов StringBuilder объекта, его длина увеличивается, пока он равен размеру StringBuilder.Capacity свойство, которое определяет число символов, которые может содержать объект. Если количество символов, добавленных вызывает длина StringBuilder объекта превышает его текущей емкости, новую память выделяется, значение Capacity Свойства удваивается, добавляются новые символы StringBuilder объекта и его Length настройки свойства. Дополнительная память для StringBuilder объект выделяется динамически, пока достигнет значения, определяемого StringBuilder.MaxCapacity свойство. При достижении максимальной емкости без дальнейшего память может выделяться для StringBuilder объектов и попытка добавления символов или превышать максимальной вместимости вызывает либо ArgumentOutOfRangeException или OutOfMemoryException исключения.

В следующем примере показано как StringBuilder объект выделяет память для новых и повышает ее емкость динамически при расширении строки, назначенный объекту. Код создает StringBuilder объекта путем вызова его конструктора по умолчанию (без параметров). Емкость по умолчанию для этого объекта 16 символов, которое максимальной вместимости более 2 миллиардов знаков. Добавляя строку «Это предложение». приводит новое выделение памяти, так как длина строки (19 символов) превышает емкость по умолчанию StringBuilder объекта. Емкость объекта удваивается до 32 символов, добавляется новая строка и длина объекта теперь равно 19 знаков. Код затем добавляет строку «Это дополнительные предложения». значение StringBuilder объекта 11 раз. Каждый раз, когда операции добавления вызывает длина StringBuilder удваивается объекта превышение вместимости, его емкости и Append операция выполнена успешно.

using System;
using System.Reflection;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      ShowSBInfo(sb);
      sb.Append("This is a sentence.");
      ShowSBInfo(sb);
      for (int ctr = 0; ctr <= 10; ctr++) {
         sb.Append("This is an additional sentence.");
         ShowSBInfo(sb);
      }   
   }

   private static void ShowSBInfo(StringBuilder sb)
   {
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Capacity: 16    MaxCapacity: 2,147,483,647    Length: 0
//    Capacity: 32    MaxCapacity: 2,147,483,647    Length: 19
//    Capacity: 64    MaxCapacity: 2,147,483,647    Length: 50
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 81
//    Capacity: 128    MaxCapacity: 2,147,483,647    Length: 112
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 143
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 174
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 205
//    Capacity: 256    MaxCapacity: 2,147,483,647    Length: 236
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 267
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 298
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 329
//    Capacity: 512    MaxCapacity: 2,147,483,647    Length: 360

По умолчанию объем StringBuilder объект — 16 символов, а максимальная емкость по умолчанию — Int32.MaxValue. Эти значения по умолчанию используются при вызове метода StringBuilder() и StringBuilder(String) конструкторы.

Можно явно определить начальной емкостью StringBuilder объекта следующим образом:

  • Можно вызвать любую из StringBuilder конструкторы, которые включает в себя capacity параметр при создании объекта.

  • Назначив явно новое значение StringBuilder.Capacity Свойства, чтобы развернуть существующий StringBuilder объекта. Обратите внимание, что свойство вызывает исключение, если новый объем меньше, чем существующий емкости или больше, чем StringBuilder Максимальная емкость объекта.

  • Путем вызова StringBuilder.EnsureCapacity метод новую емкость. Новая емкость не должно быть больше, чем StringBuilder Максимальная емкость объекта. Тем не менее, в отличие от назначения для Capacity Свойства EnsureCapacity не вызывает исключение, если требуемый новую емкость меньше, чем существующие емкости; таким образом, вызов метода не влияет.

Если длина строки назначены StringBuilder объекта в вызове конструктора превышает емкость по умолчанию или указанной емкостью Capacity задано значение длины строки, указанной с помощью value параметр.

Можно явно определить максимальную емкость StringBuilder путем вызова метода StringBuilder(Int32, Int32) конструктор. Максимальная емкость нельзя изменить путем назначения нового значения для MaxCapacity Свойства, так как она доступна только для чтения.

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

В общем случае емкость по умолчанию и максимальная емкость адекватны для большинства приложений. Можно принять эти значения при следующих условиях:

  • Если конечный размер StringBuilder объекта, вероятно, вырастет чрезвычайно большого, обычно сверх несколько мегабайт. В этом случае может быть некоторое повышение производительности с начальной настройки Capacity свойство значительно высокое значение для устранения необходимости для перераспределения слишком много памяти.

  • Если приложение выполняется в системе с ограниченным объемом памяти. В этом случае может понадобиться рассмотреть параметр MaxCapacity значение меньше, чем Int32.MaxValue Если приложение обрабатывает большие строки, которые может привести к его выполнения в среде с ограниченными возможностями памяти.

Следует создать экземпляр StringBuilder объекта путем вызова одного из его шесть перегруженные конструкторы класса, которые перечислены в следующей таблице. Создать три конструкторы StringBuilder объект, значение которого является пустой строкой, но задать его Capacity и MaxCapacity значения по-разному. Остальные три конструкторы определяют StringBuilder объекта, имеющего значение подстроки и емкости. Две из трех конструкторов используют по умолчанию максимальная емкость Int32.MaxValue, а третий позволяет задать максимальную емкость.

Конструктор

Строковое значение

Производительность

Максимальная емкость

StringBuilder()

String.Empty

16

Int32.MaxValue

StringBuilder(Int32)

String.Empty

Определяется capacity параметр

Int32.MaxValue

StringBuilder(Int32, Int32)

String.Empty

Определяется capacity параметр

Определяется maxCapacity параметр

StringBuilder(String)

Определяется value параметр

16 или value. Length, какое значение больше

Int32.MaxValue

StringBuilder(String, Int32)

Определяется value параметр

Определяется capacity параметр или value. Length, какое значение больше.

Int32.MaxValue

StringBuilder(String, Int32, Int32, Int32)

Определяется value. Substring(startIndex, length)

Определяется capacity параметр или value. Length, какое значение больше.

Определяется maxCapacity параметр

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

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      string value = "An ordinary string";
      int index = value.IndexOf("An ") + 3;
      int capacity = 0xFFFF;

      // Instantiate a StringBuilder from a string.
      StringBuilder sb1 = new StringBuilder(value);
      ShowSBInfo(sb1); 

      // Instantiate a StringBuilder from string and define a capacity.  
      StringBuilder sb2 = new StringBuilder(value, capacity);   
      ShowSBInfo(sb2); 

      // Instantiate a StringBuilder from substring and define a capacity.  
      StringBuilder sb3 = new StringBuilder(value, index, 
                                            value.Length - index, 
                                            capacity );
      ShowSBInfo(sb3); 
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: An ordinary string
//    Capacity: 18    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: An ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 18
//    
//    Value: ordinary string
//    Capacity: 65,535    MaxCapacity: 2,147,483,647    Length: 15

Большинство методов, изменить строку в StringBuilder экземпляр возвращают ссылку на тот же экземпляр. Это дает возможность вызвать StringBuilder методы двумя способами:

  • Можно произвести отдельные вызовы и игнорировать возвращаемое значение, как в следующем примере выполняется.

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder();
          sb.Append("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "");
          sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ");
          sb.Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    
  • Можно сделать ряд вызовов метода в одной инструкции. Это может быть удобно, если отдельная инструкция в цепочку последовательных операций записи. Следующий пример объединяет три вызова метода из предыдущего примера в одну строку кода.

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          StringBuilder sb = new StringBuilder("This is the beginning of a sentence, ");
          sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, 
                                                     "complete ").Replace(",", ".");
          Console.WriteLine(sb.ToString());
       }
    }
    // The example displays the following output:
    //        This is a complete sentence.
    

Можно использовать методы StringBuilder класса итерации, добавления, удаления или изменения символов в StringBuilder объекта.

Можно получить доступ к символы в StringBuilder с помощью StringBuilder.Chars свойство. В C# Chars является индексатором; в Visual Basic это свойство по умолчанию StringBuilder класса. Это позволяет установить или извлечь отдельных символов с использованием только индексов без явного указания Chars свойство. Символы в StringBuilder объекта начинаются с индексом 0 (ноль) и индекса по-прежнему Length - 1.

В следующем примере демонстрируется Chars свойство. Он добавляет 10 случайных чисел для StringBuilder объекта, а затем выполняется каждый символ. Если категории символов Юникода UnicodeCategory.DecimalDigitNumber, число уменьшается на 1 (или изменяется номер 9, если его значение равно 0). В примере отображается содержимое StringBuilder оба объекта до и после изменения значений отдельных символов.

using System;
using System.Globalization;
using System.Text;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      StringBuilder sb = new StringBuilder();

      // Generate 10 random numbers and store them in a StringBuilder.
      for (int ctr = 0; ctr <= 9; ctr++)
         sb.Append(rnd.Next().ToString("N5"));    

      Console.WriteLine("The original string:");
      Console.WriteLine(sb.ToString());

      // Decrease each number by one.
      for (int ctr = 0; ctr < sb.Length; ctr++) {
         if (Char.GetUnicodeCategory(sb[ctr]) == UnicodeCategory.DecimalDigitNumber) {
            int number = (int) Char.GetNumericValue(sb[ctr]);
            number--;
            if (number < 0) number = 9;

            sb[ctr] = number.ToString()[0];
         }
      }
      Console.WriteLine("\nThe new string:");
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//    The original string:
//    1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
//    000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
//    .00000
//    
//    The new string:
//    0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
//    999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
//    .99999

StringBuilder Класс содержит следующие методы для расширения содержимого StringBuilder объекта:

  • Append Метод добавляет строку, подстроку, массив символов, часть в массив символов, один символ повторяется несколько раз, либо строковое представление примитивных данных тип на StringBuilder объект.

  • AppendLine Метод добавляет признак конца строки или строки вместе с признаком конца строки в StringBuilder объекта.

  • AppendFormat Метод добавляет к StringBuilder объекта. Строковые представления объектов, включенных в результирующей строке может отражать соглашения о форматировании текущего языка и региональных параметров системы или заданных региональных параметров.

  • Insert Метод вставляет строки, подстроки, несколько повторения строки, массив символов, часть массив символов или строковым представлением простых данных и тип в заданной позиции в StringBuilder объекта. Отсчитываемый от нуля индекс, определяется положение.

В следующем примере используется Append, AppendLine, AppendFormat, и Insert методов, чтобы развернуть текст StringBuilder объекта.

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      // Create a StringBuilder object with no text.
      StringBuilder sb = new StringBuilder();
      // Append some text.
      sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
      sb.AppendLine("\n");
      sb.AppendLine("Some code points and their corresponding characters:");
      // Append some formatted text.
      for (int ctr = 50; ctr <= 60; ctr++) {
         sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
         sb.AppendLine();
      }
      // Find the end of the introduction to the column.
      int pos = sb.ToString().IndexOf("characters:") + 11 + 
                Environment.NewLine.Length;
      // Insert a column header.
      sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", 
                                   "Character", "\n"));      

      // Convert the StringBuilder to a string and display it.      
      Console.WriteLine(sb.ToString());      
   }
}
// The example displays the following output:
//    ********** Adding Text to a StringBuilder Object **********
//    
//    Some code points and their corresponding characters:
//    
//       Code Unit    Character
//            0032            2
//            0033            3
//            0034            4
//            0035            5
//            0036            6
//            0037            7
//            0038            8
//            0039            9
//            003A            :
//            003B            ;
//            003C            <

StringBuilder Класс содержит методы, которые можно уменьшить размер текущего StringBuilder экземпляра. Clear Метод удаляет все символы и задает Length свойства значение 0. Remove Метод удаляет указанное количество символов, начиная с определенного индекса. Кроме того, можно удалить символы в конце StringBuilder объектом, присвоив его Length свойству значение, которое меньше, чем длина текущего экземпляра.

Следующий пример удаляет текст из StringBuilder отображает результирующий емкости, максимальная емкость и длина значения свойств объекта, а затем вызывает Clear метод для удаления всех символов из StringBuilder объекта.

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder("A StringBuilder object");
      ShowSBInfo(sb);
      // Remove "object" from the text.
      string textToRemove = "object";
      int pos = sb.ToString().IndexOf(textToRemove);
      if (pos >= 0) {
         sb.Remove(pos, textToRemove.Length);
         ShowSBInfo(sb);
      }
      // Clear the StringBuilder contents.
      sb.Clear();
      ShowSBInfo(sb);   
   }

   public static void ShowSBInfo(StringBuilder sb)
   {
      Console.WriteLine("\nValue: {0}", sb.ToString());
      foreach (var prop in sb.GetType().GetProperties()) {
         if (prop.GetIndexParameters().Length == 0)
            Console.Write("{0}: {1:N0}    ", prop.Name, prop.GetValue(sb));
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    Value: A StringBuilder object
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 22
//    
//    Value: A StringBuilder
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 16
//    
//    Value:
//    Capacity: 22    MaxCapacity: 2,147,483,647    Length: 0

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

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
      MyStringBuilder.Replace('!', '?');
      Console.WriteLine(MyStringBuilder);
   }
}
// The example displays the following output:
//       Hello World?

StringBuilder Класса не включает методы аналогично String.Contains, String.IndexOf, и String.StartsWith методов, предоставляемых String класс, который можно выполнять поиск объектов для конкретного символа или подстроки. Определение наличия или позиция первого символа подстроки требуется выполнить поиск String значение с помощью метода строку поиска или метода регулярного выражения. Существует четыре способа для реализации такого поиска, как показано в следующей таблице.

Метод

Специалисты

Недостатки

Поиск значений строки перед добавлением их к StringBuilder объекта.

Полезно для определения, существует ли подстроки.

Нельзя использовать индекс подстроки является важной.

Вызов ToString и поиск возвращаемый String объекта.

Простой в использовании при указании весь текст до StringBuilder объекта, а затем начните для внесения изменений.

Громоздкие неоднократно вызывают ToString Если необходимо внести изменения, перед добавлением весь текст StringBuilder объекта.

Необходимо помнить, для работы с конца StringBuilder текста объекта при внесении изменений.

Используйте Chars свойство для последовательного поиска диапазона символов.

Полезно, если вас интересует отдельные символы или небольших подстроки.

Сложно, если количество символов для поиска больших или сложна логика поиска.

Преобразование StringBuilder объекта String объекта и внесения изменений на String объект.

В случае небольшое количество изменений.

Инвертирует преимуществ StringBuilder класса, если большое количество изменений.

Давайте рассмотрим эти методики подробнее.

  • Если цель поиска для определения наличия определенной подстрокой (то есть, если вы не хотите в положение подстроки), можно выполнять поиск строки перед их сохранением в StringBuilder объекта. Ниже приведен один из возможных вариантов реализации. Он определяет StringBuilderFinder конструктор которого передается ссылка на класс StringBuilder объекта и подстрока для поиска в строке. В этом случае предпринимается попытка определить, имеют ли записанные температуры в градусах Фаренгейта и Цельсия и добавляет соответствующие вводный текст в начало StringBuilder объекта. Генератор случайных чисел используется для выбора массив, содержащий данные в градусах Цельсия или Фаренгейта.

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          Random rnd = new Random();
          string[] tempF = { "47.6F", "51.3F", "49.5F", "62.3F" };
          string[] tempC = { "21.2C", "16.1C", "23.5C", "22.9C" };
          string[][] temps = { tempF, tempC }; 
    
          StringBuilder sb = new StringBuilder();
          var f = new StringBuilderFinder(sb, "F");
          var baseDate = new DateTime(2013, 5, 1); 
          String[] temperatures = temps[rnd.Next(2)];
          bool isFahrenheit = false;
          foreach (var temperature in temperatures) {
             if (isFahrenheit)
                sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature);
             else
                isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}\n", 
                                                 baseDate, temperature));
             baseDate = baseDate.AddDays(1);
          }            
          if (isFahrenheit) {
             sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit");
             sb.Insert(47, "\n\n");
          }
          else {
             sb.Insert(0, "Average Daily Temperature in Degrees Celsius");
             sb.Insert(44, "\n\n");
          }   
          Console.WriteLine(sb.ToString());
       }
    }
    
    public class StringBuilderFinder
    {
       private StringBuilder sb;
       private String text;
    
       public StringBuilderFinder(StringBuilder sb, String textToFind)
       {
          this.sb = sb;
          this.text = textToFind;
       }
    
       public bool SearchAndAppend(String stringToSearch)
       {
          sb.Append(stringToSearch);
          return stringToSearch.Contains(text);
       }
    }
    // The example displays output similar to the following:
    //    Average Daily Temperature in Degrees Celsius
    //    
    //    5/1/2013: 21.2C
    //    5/2/2013: 16.1C
    //    5/3/2013: 23.5C
    //    5/4/2013: 22.9C
    
  • Вызов StringBuilder.ToString метода для преобразования StringBuilder объект String объект. Выполните поиск строки с помощью методов, таких как String.LastIndexOf или String.StartsWith, или можно использовать регулярные выражения и Regex класса для поиска по шаблону. Поскольку оба StringBuilder и String объекты используют для хранения символов, позиции индекса символов подстрок, кодирование UTF-16 и совпадений регулярного выражения одинаковы в обоих объектах. Это позволяет использовать StringBuilder методы для внесения изменений в той же позиции, с которой текст находится в String объекта.

    System_CAPS_noteПримечание

    Если принять этот подход, нужно работать с конца StringBuilder его начала, чтобы не нужно повторно преобразовать объект StringBuilder объект в строку.

    Этот подход показан в приведенном ниже примере. Он сохраняет четыре вхождения каждой буквы английского алфавита в StringBuilder объекта. Затем он преобразовывает текст, String объекта и используется регулярное выражение, чтобы определить начальную позицию каждого последовательность четырех знаков. Наконец он добавляет символ подчеркивания перед каждой последовательности четыре символа, за исключением первой последовательности и преобразует первый знак в верхний регистр последовательности.

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Create a parallel string object.
          String sbString = sb.ToString();
          // Determine where each new character sequence begins.
          String pattern = @"(\w)\1+";
          MatchCollection matches = Regex.Matches(sbString, pattern);
    
          // Uppercase the first occurrence of the sequence, and separate it
          // from the previous sequence by an underscore character.
          for (int ctr = matches.Count - 1; ctr >= 0; ctr--) { 
             Match m = matches[ctr];
             sb[m.Index] = Char.ToUpper(sb[m.Index]);
             if (m.Index > 0) sb.Insert(m.Index, "_");
          }
          // Display the resulting string.
          sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • Используйте StringBuilder.Chars свойство для последовательного поиска диапазон символов в StringBuilder объекта. Если количество символов для поиска слишком большой или особо сложной логики поиска этот подход может быть непрактично.

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

    using System;
    using System.Text;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort) 'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Iterate the text to determine when a new character sequence occurs.
          int position = 0;
          Char current = '\u0000';
          do {
             if (sb[position] != current) {
                current = sb[position];
                sb[position] = Char.ToUpper(sb[position]);
                if (position > 0) 
                   sb.Insert(position, "_");
                position += 2;
             }
             else {
                position++;
             }      
          } while (position <= sb.Length - 1);
          // Display the resulting string.
          String sbString = sb.ToString();
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    
  • Сохранить без изменений текста в StringBuilder вызовите StringBuilder.ToString метода для преобразования StringBuilder объекта String объекта и внесения изменений на String объект. Этот подход можно использовать, если у вас есть несколько изменений; в противном случае — стоимость работы с неизменяемыми строки могут поставить под сомнение повышение производительности с использованием StringBuilder объекта.

    В следующем примере ту же функциональность предыдущих двух примерах, но отличается в реализации. Он создает StringBuilder объекта, преобразует ее в String объекта, а затем использует регулярное выражение для выполнения всех оставшихся изменений в строке. Regex.Replace(String, String, MatchEvaluator) Метод использует лямбда-выражение для выполнения замены каждого соответствия.

    using System;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          // Create a StringBuilder object with 4 successive occurrences 
          // of each character in the English alphabet. 
          StringBuilder sb = new StringBuilder();
          for (ushort ctr = (ushort)'a'; ctr <= (ushort) 'z'; ctr++)
             sb.Append(Convert.ToChar(ctr), 4);
    
          // Convert it to a string.
          String sbString = sb.ToString();
    
          // Use a regex to uppercase the first occurrence of the sequence, 
          // and separate it from the previous sequence by an underscore.
          string pattern = @"(\w)(\1+)";
          sbString = Regex.Replace(sbString, pattern, 
                                   m => (m.Index > 0 ? "_" : "") + 
                                   m.Groups[1].Value.ToUpper() + 
                                   m.Groups[2].Value);
    
          // Display the resulting string.
          int line = 0;
          do {
             int nChars = line * 80 + 79 <= sbString.Length ? 
                                 80 : sbString.Length - line * 80;
             Console.WriteLine(sbString.Substring(line * 80, nChars));
             line++;
          } while (line * 80 < sbString.Length);
       }
    }
    // The example displays the following output:
    //    Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_
    //    Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
    

Необходимо преобразовать StringBuilder объекта String объекта, прежде чем можно будет передать строку, представленную StringBuilder объекта метод, который имеет String параметра или его отображения в пользовательском интерфейсе. Преобразование выполняется путем вызова StringBuilder.ToString метод. Иллюстрация, см. в предыдущем примере, который вызывает ToString метода для преобразования StringBuilder объекта в строку, чтобы его можно передавать в метод регулярного выражения.

Заметки к вызывающим объектам:

В.NET Framework 4 и .NET Framework 4.5, при создании экземпляра StringBuilder путем вызова метода StringBuilder(Int32, Int32) конструктор, длина и объем StringBuilder экземпляр может выйти за пределы значение его MaxCapacity свойство. Это может произойти, особенно при вызове метода Append и AppendFormat методов для добавления небольших строк.

Приведенный ниже показано, как вызывать многие из методов, определенных StringBuilder класса.

using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 1.1
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

Любые открытые статические элементы ( Предоставлен общий доступ в Visual Basic) этого типа являются потокобезопасными. Потокобезопасность элементов экземпляров не гарантируется.

Вернуться в начало
Показ: