Concatenação de string usando o operador '+'


Respostas:


143

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.


8
Boa resposta; apenas uma pergunta de acompanhamento: se você está concatenando strings dentro de um loop, como o compilador funciona com o operador .Concat quando não pode saber com antecedência o que estará no loop.
francesa

Ah ok! E é por isso que é melhor usar o StringBuilder para concatenações?
francesa

4
@frenchie: É por isso que é melhor usar StringBuilder para concatenação repetida ... mas por que não vale a pena para concatenação de um número fixo de valores .
Jon Skeet

@ Jon-Skeet: obrigado pelo esclarecimento rápido ... eu deveria ter verificado no IL também ... e é assim que o int adiciona também? chamando o método Add?
NoviceProgrammer

2
Mas observe que hoje em dia os métodos string.Concate string.Jointêm muitas sobrecargas, incluindo algumas tomando em uma IEnumerable<>instância. Portanto, eles são mais convenientes de usar na maioria dos casos do que usar um StringBuilder(não sei se esses métodos usam um StringBuilderinternamente, apenas digo que são mais convenientes na maioria dos casos).
Jeppe Stig Nielsen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.