Ответ
Оптимальный способ зависит от контекста. Основное правило: для динамической конкатенации множества строк в цикле используйте StringBuilder.
1. StringBuilder (лучший выбор для циклов и неизвестного числа операций) Он избегает создания промежуточных строк, работая с изменяемым буфером.
var sb = new StringBuilder();
// Предварительное выделение емкости улучшает производительность
// sb.EnsureCapacity(estimatedFinalLength);
for (int i = 0; i < 10000; i++)
{
sb.Append("some string ");
}
string result = sb.ToString();
2. string.Join (лучший выбор для объединения коллекции строк) Эффективен и читаем.
string[] words = { "Hello", "World", "from", "C#" };
string sentence = string.Join(" ", words);
// С современным C# и интерполяцией
string path = string.Join("/", parts); // parts - массив строк
3. Интерполяция строк ($) или сложение (+) для малого, известного числа строк Для 2-5 статических строк это нормально, компилятор оптимизирует.
string name = "John";
string greeting = $"Hello, {name}!"; // Хорошо
string fullName = firstName + " " + lastName; // Хорошо
Почему не обычная конкатенация в цикле?
Каждая операция str1 + str2 создает новый строковый объект, так как строки в C# неизменяемы (immutable). Это приводит к квадратичному росту аллокаций памяти и времени выполнения (O(n²)). StringBuilder решает эту проблему, накапливая символы в буфере (O(n) в среднем).
Дополнительная оптимизация:
Если конечная длина строки примерно известна, используйте конструктор StringBuilder(int capacity) или метод EnsureCapacity, чтобы минимизировать переаллокации внутреннего буфера.
Ответ 18+ 🔞
Ну вот, опять про эти ваши строки в C#. Сидишь такой, пишешь код, и думаешь: "А че, собственно, может пойти не так? Сложил пару строк — и в ус не дуешь". А потом бац — производительность просела, как старая табуретка, и приложение жрёт память, как не в себя.
Так вот, слушай сюда, главное правило, которое тебе надо выжечь на подкорке: если ты в цикле собираешь кучу строк в одну — используй StringBuilder. Всё, точка. Не надо тут изобретать велосипед.
1. StringBuilder (Твой лучший друг, когда строк много и они плодятся) Эта штука не создаёт новую строку каждый раз, когда ты что-то добавляешь. Она копит всё в одном буфере, как умный человек. И только в конце выдаёт тебе готовый результат.
var sb = new StringBuilder();
// Если знаешь примерно, сколько символов будет — скажи ему заранее, чтоб не дергался.
// sb.EnsureCapacity(estimatedFinalLength);
for (int i = 0; i < 10000; i++)
{
sb.Append("какой-то текст ");
}
string итоговаяСтрока = sb.ToString(); // Вот тут уже всё готово, одним махом.
2. string.Join (Идеально, когда у тебя уже есть готовый список или массив строк) Красиво, элегантно, и не надо городить огород с циклом. Просто склеил через разделитель — и делу конец.
string[] слова = { "Привет", "мир", "от", "C#" };
string предложение = string.Join(" ", слова); // "Привет мир от C#"
3. Интерполяция ($) или сложение (+) для парочки строк Ну тут всё просто. Собрал две-три строки — и спи спокойно. Компилятор за тебя всё оптимизирует, он не дурак.
string имя = "Вася";
string приветствие = $"Ну привет, {имя}!"; // Отлично.
string полноеИмя = имя + " " + фамилия; // Тоже норм.
А теперь, блядь, самое важное — почему НЕЛЬЗЯ просто складывать строки в цикле?
Представь себе: строка в C# — это как застывший бетон. Неизменяемая. Каждый раз, когда ты пишешь строка1 + строка2, система не "дописывает" вторую к первой. Она, сука, создаёт совершенно новый кусок бетона, куда копирует и первую, и вторую часть. А старый кусок потом мусорщик убирает. И так на каждой итерации! Представь, сколько мусора и лишней работы, если цикл на 10 тысяч итераций. Производительность летит в пизду квадратично. StringBuilder же работает с изменяемым буфером — он просто дописывает символы в конец, как в блокнот. Быстро и без лишнего геморроя.
Лайфхак для самых дотошных:
Если ты примерно прикинул, сколько символов в итоге получится, — дай знать StringBuilder'у сразу. Вызови new StringBuilder(емкость) или EnsureCapacity. Тогда он сразу выделит нужный размер буфера и не будет нервно переезжать в новую квартиру (переаллоцировать память) по десять раз за операцию.