Ответ 1
Это не так: компилятор С# делает:)
Итак, этот код:
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);
(Gah - промежуточное редактирование случайно удалило другие разряды.)
Преимущество компилятора С#, замечающего, что здесь есть несколько конкатенаций строк, заключается в том, что вы не создаете промежуточную строку x + y
, которая затем должна быть скопирована снова как часть конкатенации (x + y)
и z
. Вместо этого мы делаем все это за один раз.
EDIT: Обратите внимание, что компилятор ничего не может сделать, если вы конкатенируете в цикле. Например, этот код:
string x = "";
foreach (string y in strings)
{
x += y;
}
просто заканчивается как эквивалент:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
... так что это создает много мусора, и почему вы должны использовать StringBuilder
для таких случаев. У меня есть статья в которой мы подробно расскажем об этих двух, которые, надеюсь, ответят на другие вопросы.