Полное руководство по языку программирования С# 14 и платформе .NET 10 / Работа со строками

Класс StringBuilder

Начальный ⏱ 4 мин чтения 👁 2 🕓 обновлено 11.08.2026

Хотя класс System.String предоставляет нам широкую функциональность по работе со строками, все таки он имеет свои недостатки. Прежде всего, объект String представляет собой неизменяемую строку. Когда мы выполняем какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места. Удаление первого символа - не самая затратная операция. Однако когда подобных операций множество, а объем текста, для которого надо выполнить данные операции, также не самый маленький, то издержки при потере производительности становятся более существенными.

Чтобы выйти из этой ситуации во фреймворк .NET был добавлен новый класс StringBuilder, который находится в пространстве имен System.Text. Этот класс представляет динамическую строку.

Создание StringBuilder

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


using System.Text;

StringBuilder sb = new StringBuilder();

Можно сразу инициализировать объект определенной строкой:


StringBuilder sb = new StringBuilder("Привет мир");

С помощью метода ToString() мы можем получить строку, которая хранится в StringBuilder:


var sb = new StringBuilder("Hello World");
Console.WriteLine(sb.ToString());    //  Hello World

Либо можно просто передать объект StringBuilder:


var sb = new StringBuilder("Hello World");
Console.WriteLine(sb);    //  Hello World

Длина и емкость StringBuilder

Для хранения длины строки в классе StringBuilder определенно свойство Length. Однако есть и вторая величина - емкость выделенной памяти. Это значение хранится в свойстве Capacity. Емкость - это выделенная память под объект. Установка емкости позволяет уменьшить выделения памяти и тем самым повысить производительность.

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

Например, посмотрим, что содержат данные свойства:


using System.Text;

StringBuilder sb = new StringBuilder("Привет мир");
Console.WriteLine($"Длина: {sb.Length}");		// Длина: 10
Console.WriteLine($"Емкость: {sb.Capacity}");	// Емкость: 16

Хотя в данном случае длина равна 10 символов, но реально емкость будет составлять по умолчанию 16 символов. То есть мы видим, что при создании строки StringBuilder выделяет памяти больше, чем необходимо этой строке. При увеличении строки в StringBuilder, когда количество символов превосходит начальную емкость, то емкость увеличивается в два и более раз.

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


var sb = new StringBuilder(32);

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

var sb = new StringBuilder("Привет мир", 32);

Операции со строками в StringBuilder

Для операций над строками класс StringBuilder определяет ряд методов:

  • Append: добавляет подстроку в объект StringBuilder

  • Insert: вставляет подстроку в объект StringBuilder, начиная с определенного индекса

  • Remove: удаляет определенное количество символов, начиная с определенного индекса

  • Replace: заменяет все вхождения определенного символа или подстроки на другой символ или подстроку

  • AppendFormat: добавляет подстроку в конец объекта StringBuilder

Теперь посмотрим на примере метода Append() использование и преимущества класса StringBuilder:


using System.Text;

var sb = new StringBuilder("Название: ");
Console.WriteLine(sb);   // Название: 
Console.WriteLine($"Длина: {sb.Length}"); // 10
Console.WriteLine($"Емкость: {sb.Capacity}"); // 16

sb.Append(" Руководство");
Console.WriteLine(sb);   // Название: Руководство
Console.WriteLine($"Длина: {sb.Length}"); // 22
Console.WriteLine($"Емкость: {sb.Capacity}"); // 32

sb.Append(" по C#");
Console.WriteLine(sb);   // Название: Руководство по C#
Console.WriteLine($"Длина: {sb.Length}"); // 28
Console.WriteLine($"Емкость: {sb.Capacity}"); // 32

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

Дальше применяется метод Append - этот метод добавляет к строке подстроку. Так как при объединении строк их общая длина - 22 символа - превышает начальную емкость в 16 символов, то начальная емкость удваивается - до 32 символов.

Если бы итоговая длина строки была бы больше 32 символов, то емкость расширялась бы до размера длины строки.

Далее опять применяется метод Append, однако финальная длина уже будет 28 символов, что меньше 32 символов, и дополнительная память не будет выделяться.

Используем остальные методы StringBuilder:


var sb = new StringBuilder("Привет мир");
sb.Append("!");
sb.Insert(7, "компьютерный ");
Console.WriteLine(sb);	// Привет компьютерный мир!

// заменяем слово
sb.Replace("мир", "world");
Console.WriteLine(sb);	// Привет компьютерный world!

// удаляем 13 символов, начиная с 7-го
sb.Remove(7, 13);
Console.WriteLine(sb);	// Привет world!

// получаем строку из объекта StringBuilder
string text = sb.ToString();
Console.WriteLine(text);	// Привет world!

Когда надо использовать класс String, а когда StringBuilder?

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

  • При небольшом количестве операций и изменений над строками

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

  • Когда надо выполнять масштабные операции поиска при построении строки, например IndexOf или StartsWith. Класс StringBuilder не имеет подобных методов.

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

  • При неизвестном количестве операций и изменений над строками во время выполнения программы

  • Когда предполагается, что приложению придется сделать множество подобных операций

Проверь себя

📋 Тест по теме «Класс StringBuilder» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using _____.Text;

StringBuilder sb = new StringBuilder();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

StringBuilder sb = _____ StringBuilder("Привет мир");
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var sb = new StringBuilder("_____ World");
Console.WriteLine(sb.ToString());    //  Hello World
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var sb = new StringBuilder("Hello _____");
Console.WriteLine(sb);    //  Hello World
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System.Text;

_____ sb = new StringBuilder("Привет мир");
Console.WriteLine($"Длина: {sb.Length}");		// Длина: 10
Console.WriteLine($"Емкость: {sb.Capacity}");	// Емкость: 16
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

using _____.Text;

_____ sb = new StringBuilder();
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

_____ sb = _____ StringBuilder("Привет мир");
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

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

Console.WriteLine($"Емкость: {sb.Capacity}");	// Емкость: 16
using System.Text;
StringBuilder sb = new StringBuilder("Привет мир");
Console.WriteLine($"Длина: {sb.Length}");		// Длина: 10
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Класс StringBuilder»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Класс StringBuilder», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

using System.Text;

StringBuilder sb = new StringBuilder();
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Класс StringBuilder»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

StringBuilder sb = new StringBuilder("Привет мир");
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Класс StringBuilder»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Класс StringBuilder»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Класс StringBuilder». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.