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 + y
qual 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 StringBuilder
para tais casos. Eu tenho um artigo entrando em mais detalhes sobre os dois que espero responder a outras perguntas.
string.Concat
estring.Join
têm muitas sobrecargas, incluindo algumas tomando em umaIEnumerable<>
instância. Portanto, eles são mais convenientes de usar na maioria dos casos do que usar umStringBuilder
(não sei se esses métodos usam umStringBuilder
internamente, apenas digo que são mais convenientes na maioria dos casos).