В чем разница между String, StringBuilder и StringBuffer в 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.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши строки в C#! Слушай, тут народ постоянно путается, будто в C# есть какой-то StringBuffer. Так вот, запомни раз и навсегда: этого говна тут нет! Это чисто явашная приблуда. У нас есть только два главных героя: обычный string и его прокачанный братан StringBuilder.

И разница между ними — просто пиздец какая важная, если не хочешь, чтобы твоё приложение жрало память как не в себя.

string (он же System.String) — это как памятник. Он неизменяемый, immutable, блядь. Высекли на камне — и всё. Попробуй что-то поменять (Substring, Replace, да даже тупую конкатенацию + сделай) — он тебе тут же новый памятник отольёт! Старый на свалку истории, новый в память. И так каждый раз. Если это в цикле на 1000 итераций делать — получишь овердохуища мусорных объектов, и сборщик мусора тебя просто возненавидит. Используй его для текста, который менять не планируется. Всё.

StringBuilder — это как пластилин. Он изменяемый, mutable. Создал кусок, и дальше лепишь что хочешь: Append, Insert — всё происходит внутри одного массива символов, без создания новых объектов на каждое чихание. Пока массив не заполнится, конечно. А когда закончил лепку — вызываешь .ToString() и получаешь готовую, красивую, неизменяемую строку-памятник. Один раз.

Смотри, как это на практике выглядит:

// ТУПОЙ И ДОРОГОЙ СПОСОБ (со string):
string result = "";
for (int i = 0; i < 100; i++)
{
    result += i.ToString(); // На каждой итерации, ёпта, НОВАЯ строка! 100 раз!
}
// К концу цикла у тебя в памяти 100 выброшенных строк и одна итоговая.
// Сборщик мусора плачет кровавыми слезами.

// УМНЫЙ И БЫСТРЫЙ СПОСОБ (с StringBuilder):
var sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
    sb.Append(i); // Просто тычем символы во внутренний буфер. Ничего нового не создаётся.
}
string finalResult = sb.ToString(); // И ТОЛЬКО ЗДЕСЬ создаётся одна итоговая строка.
// Красота, эффективность, порядок в памяти.

Итоговая рекомендация, чтоб не быть мудаком: Если тебе нужно склеить две строки разок — используй string и не парься. Если же в коде начинается цирк с конкатенацией в цикле, или ты строишь строку из кучи кусочков — бери StringBuilder и не выёбывайся. Он для этого и придуман, чтобы не тратить ресурсы впустую. Всё просто, как три копейки.