2012-04-26 17 views

Respuesta

124

No hace - el compilador de C# hace :)

lo que este código:

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

realidad se compila como:

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

(Gah - intervenir editar eliminado accidentalmente otros bits).

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

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

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

sólo termina como equivalente a:

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

... así que esto qué generan una gran cantidad de basura, y es por eso que debe utilizar un StringBuilder de tales casos. Tengo un article going into more details about the two que con suerte responderá más preguntas.

+8

Buena respuesta; solo una pregunta de seguimiento: si está concatenando cadenas dentro de un bucle, ¿cómo funciona el compilador del operador .Concat cuando no puede saber de antemano qué va a pasar? – frenchie

+0

@frenchie: Se editará para esto. –

+0

¡Ah bien! ¿Y por eso es mejor usar StringBuilder para concatenaciones? – frenchie

Cuestiones relacionadas