Как работает StringBuilder в C#?

«Как работает StringBuilder в C#?» — вопрос из категории C# Core, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

StringBuilder — это класс в .NET, оптимизированный для эффективной работы с изменяемыми строками. В отличие от обычных строк (string), которые являются иммутабельными (каждое изменение создает новый объект в памяти), StringBuilder использует внутренний буфер символов, который можно изменять без постоянных переаллокаций.

Ключевые принципы работы:

  1. Буфер в памяти: StringBuilder хранит символы в массиве (char[]). При создании можно задать начальную емкость (capacity).
  2. Динамическое расширение: Если при добавлении данных (Append, Insert) места в буфере не хватает, он автоматически увеличивается (обычно удваивается). Это дорогая операция, поэтому при известном ожидаемом размере строки лучше задать начальную емкость в конструкторе.
  3. Изменение на месте: Методы Append(), Insert(), Remove(), Replace() и Clear() работают с существующим буфером.
  4. Финальное преобразование: Метод ToString() создает новую неизменяемую строку (string) на основе текущего содержимого буфера.

Пример использования:

// Создание с начальной емкостью (оптимизация для больших строк)
var sb = new StringBuilder("Hello", 50);

// Эффективная конкатенация в цикле
for (int i = 0; i < 100; i++)
{
    sb.Append(i); // Не создает 100 новых строковых объектов
}

// Другие операции
sb.Insert(5, " C#"); // "Hello C#0123..."
sb.Replace("Hello", "Hi"); // "Hi C#0123..."

// Получение результата
string finalString = sb.ToString();

Когда использовать StringBuilder:

  • Конкатенация строк в циклах (особенно с большим числом итераций).
  • Построение больших строк из множества фрагментов (например, генерация HTML, SQL-запросов, JSON).

Когда НЕ нужно использовать: Для простой конкатенации нескольких строк (string.Concat или интерполяция $"{} {}"`) обычно достаточно и эффективнее.