Non lo fa - il compilatore C # lo fa :)
Quindi questo codice:
string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
viene effettivamente compilato come:
string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(Gah - la modifica intervenuta ha rimosso accidentalmente altri bit.)
Il vantaggio del compilatore C # che nota che ci sono più concatenazioni di stringhe qui è che non si finisce per creare una stringa intermedia di x + ycui è necessario copiare nuovamente come parte della concatenazione di (x + y)e z. Invece, facciamo tutto in una volta.
EDIT: nota che il compilatore non può fare nulla se ti concatena in un ciclo. Ad esempio, questo codice:
string x = "";
foreach (string y in strings)
{
x += y;
}
finisce solo come equivalente a:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
... quindi questo fa generare un sacco di immondizia, ed è il motivo per cui si dovrebbe usare una StringBuilderper tali casi. Ho un articolo che approfondisce i dettagli sui due che si spera risponda ad ulteriori domande.