Конкатенація рядків за допомогою оператора '+'


86

Дивлячись на stringметадані класу, я бачу лише оператори ==і !=перевантажені. То як він може виконати конкатенацію для +оператора ' '?

Редагувати :

Кілька цікавих приміток від Еріка Ліпперта про об’єднання рядків:

Частина 1

Частина 2

Також є супер стаття від Джоела, згадана в частині 2 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

Відповіді:


143

Це не так - компілятор 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для таких випадків. У мене є стаття, в якій детальніше розказано про ці два, і, сподіваюся, відповість на подальші запитання.


8
Гарна відповідь; просто наступне запитання: якщо ви об'єднуєте рядки всередині циклу, як компілятор працює з оператором .Concat, коли він не може заздалегідь знати, що буде в циклі.
французька

Ну гаразд! І тому краще використовувати StringBuilder для об’єднання?
французька

4
@frenchie: Тому краще використовувати StringBuilder для повторного об'єднання ... але чому це не варто для об'єднання фіксованої кількості значень .
Джон Скіт,

@ Джон-Скіт: дякую за швидке роз'яснення ... мені також слід було перевірити в ІЛ .. і це так само додає int? викликаючи метод Add?
NoviceProgrammer

2
Але зауважте, що в наш час методи string.Concatand string.Joinмають багато перевантажень, в тому числі деякі, що приймають IEnumerable<>екземпляр. Тому їх зручніше використовувати в більшості випадків, ніж використовувати StringBuilder(я не знаю, чи ці методи використовують StringBuilderвнутрішньо, я просто кажу, що вони в більшості випадків зручніші).
Jeppe Stig Nielsen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.