В чем разница между String, StringBuilder и StringBuffer в C#?

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

Ответ

В C# существуют только string (ключевое слово, синоним System.String) и StringBuilder (System.Text.StringBuilder). StringBuffer — это класс из Java, в C# его нет.

Ключевые различия:

  1. string (System.String):

    • Неизменяемый (immutable) тип. Любая операция, изменяющая строку (Substring, Replace, конкатенация +), создает новый объект в памяти.
    • Оптимален для хранения и представления текста, который не будет меняться.
    • Частые модификации приводят к нагрузке на сборщик мусора из-за создания множества промежуточных объектов.
  2. StringBuilder:

    • Изменяемый (mutable) класс, специально разработанный для эффективного построения строк через множество операций.
    • Хранит символы во внутреннем массиве. Операции вроде Append или Insert модифицируют этот массив, не создавая новых объектов, пока не будет достигнута его емкость.
    • Для получения конечной строки необходимо вызвать метод .ToString().

Практический пример:

// НЕЭФФЕКТИВНО с String: создается 100 промежуточных строк.
string result = "";
for (int i = 0; i < 100; i++)
{
    result += i.ToString(); // Каждое присваивание создает новый объект!
}

// ЭФФЕКТИВНО с StringBuilder: изменения происходят "на месте".
var sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
    sb.Append(i); // Модифицирует внутренний буфер
}
string finalResult = sb.ToString(); // Создание строки происходит один раз

Рекомендация: Используйте StringBuilder, когда вам нужно выполнить много (особенно в цикле) операций по модификации строки. Для простых конкатенаций или неизменяемых строк достаточно string.