Tak nie jest - kompilator C # robi :)
Więc ten kod:
string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
w rzeczywistości jest kompilowany jako:
string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(Gah - interwencja edycji usunęła przypadkowo inne bity.)
Zaletą kompilatora C #, który zauważa, że istnieje tutaj wiele konkatenacji ciągów, jest to, że nie tworzysz pośredniego ciągu, x + y
który następnie musi zostać ponownie skopiowany w ramach łączenia (x + y)
i z
. Zamiast tego robimy to wszystko za jednym zamachem.
EDYCJA: Zauważ, że kompilator nie może nic zrobić, jeśli połączysz się w pętli. Na przykład ten kod:
string x = "";
foreach (string y in strings)
{
x += y;
}
po prostu kończy się jako odpowiednik:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
... więc nie generują dużo śmieci, i to, dlaczego należy używać StringBuilder
do takich przypadków. Mam artykuł zawierający więcej szczegółów na temat tych dwóch, który, mam nadzieję, odpowie na dalsze pytania.
string.Concat
istring.Join
mają wiele przeciążeń, w tym niektóre przyjmująceIEnumerable<>
instancję. Są więc wygodniejsze w użyciu w większości przypadków niż użycie aStringBuilder
(nie wiem, czy te metody używająStringBuilder
wewnętrznie, po prostu mówię, że są one wygodniejsze w większości przypadków).