Что такое StringBuilder в C# и когда его использовать?
Что проверяют
Понимает ли кандидат, почему string неизменяем и во что это обходится, и умеет ли отличать горячий путь от преждевременной оптимизации. Ответ уровня «StringBuilder быстрее» без условий сразу показывает границу знаний.
Как отвечать
Строка в .NET неизменяема: любая конкатенация создаёт новый объект и копирует содержимое. В цикле на тысячу итераций это квадратичный объём копирования и гора мусора в куче. StringBuilder держит изменяемый буфер и дописывает в конец, а готовую строку отдаёт один раз в ToString().
var sb = new StringBuilder(capacity: 1024);
foreach (var row in rows)
sb.Append(row.Id).Append(';').AppendLine(row.Name);
var result = sb.ToString();Когда он не нужен: выражение a + b + c компилятор сворачивает в один вызов String.Concat, интерполяция в современных версиях языка собирается через специальный обработчик без промежуточных строк, а для склейки коллекции есть string.Join и string.Concat, которые обычно лучше ручного цикла. На двух-трёх кусках StringBuilder только добавляет лишний объект.
Что ещё стоит назвать: заданная заранее ёмкость экономит перевыделения буфера; Append(char) дешевле, чем добавление строки из одного символа; AppendFormat дороже простого Append; класс не потокобезопасен; для коротких строк без лишних выделений есть string.Create и работа со Span.
Где спотыкаются
Превращают инструмент в правило и лепят StringBuilder на склейку двух значений, где обычная конкатенация и короче, и быстрее.
Зовут ToString() внутри цикла, чтобы что-то проверить или залогировать, и возвращают ровно ту квадратичность, ради ухода от которой всё затевалось.
Считают, что класс вообще не выделяет память. Буфер растёт по мере надобности, и без заданной ёмкости на больших объёмах будет серия перевыделений; отдельная классическая ошибка это общий статический экземпляр, который тихо ломается при обращении из нескольких потоков.