Concatenación de cadenas usando el operador '+'

Respuestas:

143

No lo hace, el compilador de C # lo hace :)

Entonces este código:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

en realidad se compila como:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah, la edición intermedia eliminó otros bits accidentalmente).

El beneficio de que el compilador de C # advierta que hay múltiples concatenaciones de cadenas aquí es que no termina creando una cadena intermedia de la x + yque luego debe copiarse nuevamente como parte de la concatenación de (x + y)yz . En cambio, lo hacemos todo de una vez.

EDITAR: Tenga en cuenta que el compilador no puede hacer nada si concatena en un bucle. Por ejemplo, este código:

string x = "";
foreach (string y in strings)
{
    x += y;
}

acaba siendo equivalente a:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... así que esto hace generar una gran cantidad de basura, y es por eso que debe utilizar una StringBuilderpara estos casos. Tengo un artículo con más detalles sobre los dos que, con suerte, responderá a más preguntas.

Jon Skeet
fuente
8
Buena respuesta; solo una pregunta de seguimiento: si está concatenando cadenas dentro de un bucle, ¿cómo funciona el compilador con el operador .Concat cuando no puede saber de antemano qué va a haber en el bucle?
frenchie
¡Ah, vale! ¿Y por eso es mejor usar StringBuilder para concatenaciones?
frenchie
4
@frenchie: Por eso es mejor usar StringBuilder para la concatenación repetida ... pero por qué no vale la pena para la concatenación de un número fijo de valores .
Jon Skeet
@ Jon-Skeet: gracias por la rápida aclaración ... debería haber verificado en IL también ... ¿y así es como int agrega también? llamando al método Add?
NoviceProgrammer
2
Pero tenga en cuenta que hoy en día los métodos string.Concaty string.Jointienen muchas sobrecargas, incluidas algunas que toman una IEnumerable<>instancia. Por lo tanto, son más convenientes de usar en la mayoría de los casos que usar un StringBuilder(no sé si estos métodos usan un StringBuilderinternamente, solo digo que son más convenientes en la mayoría de los casos).
Jeppe Stig Nielsen