Stringbuilder c что это
Хотя класс System.String предоставляет нам широкую функциональность по работе со строками, все таки он имеет свои недостатки. Прежде всего, объект String представляет собой неизменяемую строку. Когда мы выполняем какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места. Удаление первого символа — не самая затратная операция. Однако когда подобных операций множество, а объем текста, для которого надо выполнить данные операции, также не самый маленький, то издержки при потере производительности становятся более существенными.
Чтобы выйти из этой ситуации во фреймворк .NET был добавлен новый класс StringBuilder , который находится в пространстве имен System.Text . Этот класс представляет динамическую строку.
Создание StringBuilder
Для создания объекта StringBuilder можно использовать ряд его конструкторов. Прежде всего можно создать пустой StringBuilder:
Можно сразу инициализировать объект определенной строкой:
С помощью метода ToString() мы можем получить строку, которая хранится в StringBuilder:
Либо можно просто передать объект StringBuilder:
Длина и емкость StringBuilder
Для хранения длины строки в классе StringBuilder определенно свойство Length . Однако есть и вторая величина — емкость выделенной памяти. Это значение хранится в свойстве Capacity . Емкость — это выделенная память под объект. Установка емкости позволяет уменьшить выделения памяти и тем самым повысить производительность.
Если строка, которая передается в конструктор StringBuilder, имеет длину 16 символов или меньше, то начальная ёмкость в StringBuilder равна 16. Если начальная строка больше 16 символов, то в качестве начальной емкости StringBuilder будет использовать длину строки.
Например, посмотрим, что содержат данные свойства:
Хотя в данном случае длина равна 10 символов, но реально емкость будет составлять по умолчанию 16 символов. То есть мы видим, что при создании строки StringBuilder выделяет памяти больше, чем необходимо этой строке. При увеличении строки в StringBuilder, когда количество символов превосходит начальную емкость, то емкость увеличивается в два и более раз.
Если у нас заранее известен максимальный размер объекта, то мы можем таким образом сразу задать емкость с помощью одного из конструкторов и тем самым избежать последующих издержек при дополнительном выделении памяти.
StringBuilder также позволяет сразу задать строку и емкость:
Операции со строками в StringBuilder
Для операций над строками класс StringBuilder определяет ряд методов:
Append : добавляет подстроку в объект StringBuilder
Insert : вставляет подстроку в объект StringBuilder, начиная с определенного индекса
Remove : удаляет определенное количество символов, начиная с определенного индекса
Replace : заменяет все вхождения определенного символа или подстроки на другой символ или подстроку
AppendFormat : добавляет подстроку в конец объекта StringBuilder
Теперь посмотрим на примере метода Append() использование и преимущества класса StringBuilder:
При создании объекта StringBuilder выделяется память по умолчанию для 16 символов, так как длина начальной строки меньше 16.
Дальше применяется метод Append — этот метод добавляет к строке подстроку. Так как при объединении строк их общая длина — 22 символа — превышает начальную емкость в 16 символов, то начальная емкость удваивается — до 32 символов.
Если бы итоговая длина строки была бы больше 32 символов, то емкость расширялась бы до размера длины строки.
Далее опять применяется метод Append, однако финальная длина уже будет 28 символов, что меньше 32 символов, и дополнительная память не будет выделяться.
Используем остальные методы StringBuilder:
Когда надо использовать класс String, а когда StringBuilder?
Microsoft рекомендует использовать класс String в следующих случаях:
При небольшом количестве операций и изменений над строками
При выполнении фиксированного количества операций объединения. В этом случае компилятор может объединить все операции объединения в одну
Когда надо выполнять масштабные операции поиска при построении строки, например IndexOf или StartsWith. Класс StringBuilder не имеет подобных методов.
Класс StringBuilder рекомендуется использовать в следующих случаях:
При неизвестном количестве операций и изменений над строками во время выполнения программы
Когда предполагается, что приложению придется сделать множество подобных операций
Класс StringBuilder
Когда строка конструируется классом String, выделяется ровно столько памяти, сколько необходимо для хранения данной строки. Однако, в пространстве имен System.Text имеется класс StringBuilder, который поступает лучше и обычно выделяет больше памяти, чем нужно в данный момент. У вас, как разработчика, есть возможность указать, сколько именно памяти должен выделить StringBuilder, но если вы этого не сделаете, то будет выбран объем по умолчанию, который зависит от размера начального текста, инициализирующего экземпляр StringBuilder. Класс StringBuilder имеет два главных свойства:
Length, показывающее длину строки, содержащуюся в объекте в данный момент
Capacity, указывающее максимальную длину строки, которая может поместиться в выделенную для объекта память
Любые модификации строки происходят внутри блока памяти, выделенного экземпляру StringBuilder. Это делает добавление подстрок и замену индивидуальных символов строки очень эффективными. Удаление или вставка подстрок неизбежно остаются менее эффективными, потому что при этих операциях приходится перемещать в памяти части строки. Выделять новую память и, возможно, полностью перемещать ее содержимое приходится только при выполнении ряда действий, которые приводят к превышению выделенной емкости строки. В дополнение к избыточной памяти, выделяемой изначально на основе экспериментов, StringBuilder имеет свойство удваивать свою емкость, когда происходит переполнение, а новое значение емкости не установлено явно.
В данном примере начальная емкость StringBuilder равна 120. Всегда лучше сразу указывать емкость, превышающую предполагаемую длину строки, чтобы объекту StringBuilder не приходилось заново выделять память при переполнении. По умолчанию устанавливается емкость в 16 символов. Схематически данный пример работает следующим образом:

Т.е. при вызове метода AppendFormat() остаток текста помещается в пустое пространство без необходимости перераспределения памяти. Однако реальная эффективность, которую несет с собой применение StringBuilder, проявляется при выполнении повторных подстановок текста.
В следующей таблице перечислены основные методы класса StringBuilder:
| Метод | Назначение |
|---|---|
| Append() | Добавляет строку к текущей строке |
| AppendFormat() | Добавляет строку, сформированную в соответствии со спецификатором формата |
| Insert() | Вставляет подстроку в строку |
| Remove() | Удаляет символ из текущей строки |
| Replace() | Заменяет все вхождения символа другим символом или вхождения подстроки другой подстрокой |
| ToString() | Возвращает текущую строку в виде объекта System.String (переопределение метода класса System.Object) |
Давайте рассмотрим практический пример использования класса StringBuilder:
Класс StringBuilder . Методы класса StringBuilder . Примеры
Как известно, в языке программирования C# для работы со строками введен тип string , который соответствует классу System.String или String . Однако, при интенсивной работе со строками более целесообразно использовать класс System.Text.StringBuilder , который обеспечивает более высокую производительность в сравнении с классом String .
Отличие между классами String и StringBuilder состоит в следующем.
В случае с классом String , когда выполняется операция присваивания =
память для нового строчного литерала ( «Text2» ) перераспределяется по новому: выделяется новый участок памяти, в который копируется новая измененная строка. Память, выделенная под предыдущий фрагмент, в дальнейшем уничтожается сборщиком мусора (Garbage collector).
В классе StringBuilder при изменении строки-оригинала, память для новой строки выделяется только в случае, когда размер новой строки больше размера строки-оригинала. При этом, памяти выделяется в два раза больше предыдущего размера. Если размер новой строки меньше или равен размеру строки-оригинала, то память не перераспределяется. Такой механизм позволяет повысить быстродействие за счет уменьшения интенсивности (количества) выделения новых ресурсов и освобождения использованных ресурсов.
Вывод: при интенсивной работе со строками рекомендуется использовать класс StringBuilder , в других случаях рекомендуется использовать класс String (или string ).
2. В каком пространстве имен объявлен класс StringBuilder ?
Чтобы использовать сокращенное имя класса StringBuilder нужно предварительно подключить пространство имен System.Text
Однако, можно непосредственно обращаться к имени класса с помощью строки System.Text.StringBuilder .
3. Операция присваивания = для класса StringBuilder
В классе System.Text.StringBuilder оператор присваивания не определен. Поэтому, при объявлении объекта класса StringBuilder
использовать оператор присваивания = для присваивания объекту значения
не удастся. В этом случае компилятор выдаст ошибку
4. Операция присваивания одиночного символа по индексу в классах String и StringBuilder
Между классами System.String и System.Text.StringBuilder существует отличие при использовании операции присваивания по индексу одиночного символа.
Переменной (объекту) типа String нельзя присваивать одиночный символ по индексу как показано ниже
Одиночный символ можно только прочитать
В отличие от типа String , для типа StringBuilder отдельный символ может быть изменен по его индексу. Например
5. Создание объекта класса StringBuilder . Примеры
Класс StringBuilder имеет несколько конструкторов, которые выделяют память а также инициализируют экземпляры этого класса. Ниже приведены примеры создания экземпляров класса (объектов) StringBuilder
6. Методы класса StringBuilder
В данном разделе рассмотрены методы класса StringBuilder , используемые наиболее часто.
6.1. Метод Append() . Добавить данные к текущему экземпляру
Метод Append() предназначен для добавления копии экземпляра некоторого типа к текущему экземпляру. Метод имеет много перегруженных реализаций для разных типов.
Ниже приведены примеры некоторых реализаций метода Append() .
6.2. Изменение отдельного символа в строке. Доступ по индексу
В отличие от типа string , в классе StringBuilder можно изменять отдельный символ по его индексу. Например.
6.3. Метод Insert() . Вставка строки в заданную позицию
Метод Insert() предназначен для вставки объектов разных типов в заданную позицию строки. Метод имеет много перегруженных реализаций. Во всех реализациях первый параметр метода задает позицию вставки.
Пример.
6.4. Метод Remove() . Удаление из исходной строки диапазона символов
Метод Remove() используется для удаления из заданной строки диапазона символов начиная с заданной позиции. Метод получает два целочисленных параметра. Первый параметр указывает индекс начала, из которого удаляется строка. Второй параметр указывает количество удаляемых символов.
Пример.
6.5. Метод Replace() . Заменяет символ/подстроку в исходной строке
Метод Replace() используется для замены подстроки в строке. Метод работает как для одиночных символов так и для строк. Метод имеет несколько перегруженных реализаций, среди которых выделяются четыре нижеследующие:
- замена одного символа типа char на другой символ типа char ;
- замена одного символа типа char на другой символ типа char начиная с заданной позиции и в заданном диапазоне;
- замена одной строки типа string на другую строку типа string ;
- замена одной строки типа string на другую строку типа string начиная с заданной позиции и в заданном диапазоне.
Пример.
6.6. Метод Clear() . Очистка строки
Метод Clear() реализует очистку строки (удаление всех символов в строке).
Пример.
6.7. Метод CopyTo() . Копировать строку в массив типа char
Метод CopyTo() копирует символы из исходной строки в массив типа char ( System.Char ). Метод получает 4 параметра, которые имеют следующее назначение:
- позиция в исходной строке (тип int );
- массив-назначение (тип char[] ) в который посимвольно записываются символы исходной строки;
- позиция в массиве-назначении (тип int ) из которой начинается копирование символов из исходной строки;
- количество символов, которые копируются (тип int ).
Пример.
6.8. Метод ToString() . Конвертировать строку типа StringBuilder в строку типа String
Для конвертирования строки типа StringBuilder в строку типа String используется метод ToString() , который реализован в классе System.Object .
Согласно документации .NET Framework метод ToString() имеет две реализации общая форма которых следующая:
В первой реализации происходит простое конвертирование строки типа StringBuilder в строку типа String . Во второй реализации копируется строка начиная с позиции startIndex длиной length символов.
Пример.
6.9. Свойства Length , Capasity , MaxCapasity
В классе StringBuilder реализованы три целочисленные свойства, которые определяют характеристики строки:
Stringbuilder c что это
C# StringBuilder is similar to Java StringBuilder. A String object is immutable, i.e. a String cannot be changed once created. Every time when you use any of the methods of the System.String class, then you create a new string object in memory. For example, a string “GeeksForGeeks” occupies memory in the heap, now, by changing the initial string “GeeksForGeeks” to “GFG” will create a new string object on the memory heap instead of modifying the initial string at the same memory location. In situations where you need to perform repeated modifications to a string, we need StringBuilder class. To avoid string replacing, appending, removing or inserting new strings in the initial string C# introduce StringBuilder concept. StringBuilder is a dynamic object. It doesn’t create a new object in the memory but dynamically expands the needed memory to accommodate the modified or new string.

Declaration and Initialization of StringBuilder
StringBuilder can be declared and initialized the same way as class,
“s” is the object of StringBuilder class. Also, we can pass a string value(here “GeeksforGeeks”) as an argument to the constructor of StringBuilder.
Defining the capacity of StringBuilder
Although the StringBuilder is a dynamic object that allows you to expand the number of characters in the string that it encapsulates, you can specify a value for the maximum number of characters that it can hold. This value is called the capacity of the StringBuilder object.
- In the 1st statement we pass an integer value as an argument to the constructor. This is the maximum capacity of character that can hold a string.
- In the 2nd statement we pass string value with an integer value (that is the maximum capacity of character a string can hold) as an argument to the constructor.
Important Methods of StringBuilder Class:
- Append(string value)
- AppendFormat()
- Insert(int index, string value)
- Remove(int start, int length)
- Replace(old_val, new|_val)
StringBuilder.Append(string value) Method
The Append method can be used to add or append a string value of an object to the end of a string represented by the current StringBuilder object. AppendLine() method also come under this method. This method append the string with a newline at the end.