Ответ
Оптимальный способ зависит от контекста. Основное правило: для динамической конкатенации множества строк в цикле используйте 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, чтобы минимизировать переаллокации внутреннего буфера.