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

86

Olhando para os stringmetadados da classe, vejo apenas os operadores ==e !=sobrecarregados. Então, como ele consegue realizar a concatenação para o +operador ' '?

Editar :

Algumas notas interessantes de Eric Lippert sobre concatenação de strings:

Parte 1

Parte 2

Há também um super artigo de Joel referido na parte 2 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

NoviceProgrammer
fonte

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.

Jon Skeet
fonte
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