Це не так - компілятор 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);
(Gah - інтервенційне редагування випадково видалило інші біти.)
Перевага компілятора 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);
}
... так що це робить генерувати багато сміття, і саме тому ви повинні використовувати StringBuilderдля таких випадків. У мене є стаття, в якій детальніше розказано про ці два, і, сподіваюся, відповість на подальші запитання.