Конкатенация строк с использованием оператора '+'

86

Глядя на stringметаданные класса, я вижу только операторы ==и !=перегруженные. Итак, как он может выполнить конкатенацию для +оператора " "?

Редактировать :

Несколько интересных замечаний Эрика Липперта о конкатенации строк:

Часть 1

Часть 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);

(Дааа - промежуточное редактирование случайно удалило другие биты.)

Преимущество того, что компилятор 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в таких случаях. У меня есть статья, в которой подробно рассказывается об этих двух, и я надеюсь, что она ответит на дальнейшие вопросы.

Джон Скит
источник
8
Хороший ответ; просто последующий вопрос: если вы объединяете строки внутри цикла, как компилятор работает с оператором .Concat, если он не может заранее знать, что будет в цикле.
frenchie
Ах хорошо! И поэтому для конкатенации лучше использовать StringBuilder?
frenchie
4
@frenchie: Вот почему лучше использовать StringBuilder для повторной конкатенации ... но почему это не стоит того для конкатенации фиксированного количества значений .
Джон Скит,
@ Jon-Skeet: спасибо за быстрое разъяснение ... я должен был проверить и в IL ... и вот как int добавляет? вызвав метод Add?
NoviceProgrammer
2
Но обратите внимание , что в наше время string.Concatи string.Joinметоды имеют много перегрузок, в том числе некоторого взятия в качестве IEnumerable<>экземпляра. Так что в большинстве случаев их удобнее использовать, чем использовать StringBuilder(я не знаю, используют ли эти методы StringBuilderвнутренне, я просто говорю, что они более удобны в большинстве случаев).
Jeppe Stig Nielsen