Não faz - o compilador C # faz :)
Portanto, este código:
string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;
na verdade é compilado como:
string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);
(Gah - a edição intermediária removeu outros bits acidentalmente.)
O benefício do compilador C # perceber que existem várias concatenações de string aqui é que você não acaba criando uma string intermediária da x + yqual precisa ser copiada novamente como parte da concatenação de (x + y)e z. Em vez disso, fazemos tudo de uma vez.
EDIT: Observe que o compilador não pode fazer nada se você concatenar em um loop. Por exemplo, este código:
string x = "";
foreach (string y in strings)
{
x += y;
}
acaba sendo equivalente a:
string x = "";
foreach (string y in strings)
{
x = string.Concat(x, y);
}
... assim que este faz gerar um monte de lixo, e é por isso que você deve usar um StringBuilderpara tais casos. Eu tenho um artigo entrando em mais detalhes sobre os dois que espero responder a outras perguntas.