Вопрос по .net, string, c# – Конкатенация строк с использованием оператора «+»

84

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

Edit:

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

Часть 1

Часть 2

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

Ваш Ответ

1   ответ
139

Так этот код:

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. Вместо этого мы все делаем за один раз.

EDIT: обратите внимание, что компилятор Не может делай что угодно, если объединяешь в цикле. Например, этот код:

string x = "";
foreach (string y in strings)
{
    x += y;
}

просто заканчивается как:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... так что это Делает генерирует много мусора, и поэтому вы должны использоватьStringBuilder для таких случаев. У меня есть статья вдаваться в подробности о двух который, надеюсь, ответит на дальнейшие вопросы.

Ах хорошо! И именно поэтому лучше использовать StringBuilder для конкатенации? frenchie
Хороший ответ; просто дополнительный вопрос: если вы объединяете строки внутри цикла, как компилятор работает с оператором .Conc, at, когда он не может заранее знать, что будет в цикле. frenchie
@ frenchie: отредактирую для этого. Jon Skeet
@ frenchie: Вот почему лучше использовать StringBuilder для Повторил конкатенация ... но почему это не стоит того, чтобы конкатенация фиксированного количества значений. Jon Skeet
Обратите внимание, что в настоящее времяstring.Concat а такжеstring.Joinетоды @ имеют много перегрузок, в том числе некоторые принимаютIEnumerable<> экземпляр. Таким образом, их удобнее использовать в большинстве случаев, чем использоватьStringBuilder (Я не знаю, используют ли эти методыStringBuilder внутренне я просто говорю, что в большинстве случаев они удобнее). Jeppe Stig Nielsen

Похожие вопросы