Это не так - компилятор C # делает :)
Итак, этот код:
string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
фактически компилируется как:
string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(Дааа - промежуточное редактирование случайно удалило другие биты.)
Преимущество того, что компилятор C # замечает, что здесь существует несколько конкатенаций строк, заключается в том, что вы не создаете промежуточную строку, x + y
которую затем необходимо снова скопировать как часть конкатенации (x + y)
и z
. Вместо этого мы делаем все за один присест.
РЕДАКТИРОВАТЬ: обратите внимание, что компилятор ничего не может сделать, если вы объедините в цикл. Например, такой код:
string x = "";
foreach (string y in strings)
{
x += y;
}
просто заканчивается как эквивалент:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
... так что это действительно создает много мусора, и поэтому вы должны использовать a StringBuilder
в таких случаях. У меня есть статья, в которой подробно рассказывается об этих двух, и я надеюсь, что она ответит на дальнейшие вопросы.
string.Concat
иstring.Join
методы имеют много перегрузок, в том числе некоторого взятия в качествеIEnumerable<>
экземпляра. Так что в большинстве случаев их удобнее использовать, чем использоватьStringBuilder
(я не знаю, используют ли эти методыStringBuilder
внутренне, я просто говорю, что они более удобны в большинстве случаев).