2008-11-12 10 views

Respuesta

47

Se realiza en tiempo de compilación. Eso es exactamente equivalente a "string1string2string3".

Suponga que tiene:

string x = "string1string2string3" 
string y = "string1" + "string2" + "string3" 

El compilador realizará apropiada internar tal que x e y se refieren a los mismos objetos.

EDITAR: Se habla mucho de StringBuilder en las respuestas y los comentarios. Muchos desarrolladores parecen creer que la concatenación de cadenas debería siempre hacerse con StringBuilder. Eso es una generalización excesiva: vale la pena entender why StringBuilder is good in some situations, and not in others.

3

La concatenación se realiza en tiempo de compilación, por lo que no hay sobrecarga de tiempo de ejecución.

0

¿No puedes usar un StringBuilder?

+0

Si lo hace, el código será menos legible * y * menos rendimiento. En otras palabras, sería algo malo de hacer. –

+0

¿Bastante, pensé que si estabas haciendo un montón de concatenación, entonces se recomendó el constructor de cuerdas? – Damien

+0

Si está haciendo mucha concatenación durante el tiempo de ejecución, entonces sí, se recomienda StringBuilder. Pero el ejemplo anterior tiene cadenas estáticas, por lo que el compilador ya lo optimiza a una sola cadena. – Maxam

7

Su ejemplo se concatenará en el momento de la compilación. Todas las cadenas en línea y las variables de cadena const se concatenan en tiempo de compilación.

Algo a tener en cuenta es que la inclusión de cadenas de solo lectura retrasará la concatenación al tiempo de ejecución. string.Empty y Environment.NewLine son ambas variables de cadena de solo lectura.

1

realmente depende de lo que necesita. En general, si necesita concat cadenas, el mejor rendimiento en tiempo de ejecución se logrará mediante el uso de StringBuilder. Si hace referencia en el código fuente algo como var str = "String1" + "String2", se convertirá en cadena str = "String1String2" en la compilación. En este caso, no tiene sobrecarga de concatenación

+0

Su generalización es demasiado general: si puede realizar toda la concatenación de una vez, generalmente es más rápida (y más legible) que utilizar StringBuilder. Por lo tanto, prefiera "x + y + z" a un nuevo StringBuilder (x) .Append (y) .Append (z) .ToString(). StringBuilder es útil cuando hay concatenaciones * repetidas *. –

+0

Para el segundo punto de Jon ... StringBuilder es útil cuando se realiza un bucle, etc. Para un solo conjunto de operaciones, string.Concat es más simple y funciona igual. –

+0

Gracias Marc - Me había quedado sin espacio :) Edité mi respuesta para apuntar a mi artículo de StringBuilder ... –

37

Si el espacio en blanco no es importante, puede usar el carácter @ escape para escribir cadenas multilínea en su código. Esto es útil si usted tiene una consulta en su código, por ejemplo:

string query = @"SELECT whatever 
FROM tableName 
WHERE column = 1"; 

esto le dará una cadena con saltos de línea y las pestañas, pero para una consulta que no importa.

1

StringBuilder es una buena forma de ir si tiene muchas (más de aproximadamente cuatro) cadenas para concatenar. Es mas rapido.

El uso de String.Concat en el ejemplo anterior se realiza en tiempo de compilación. Dado que son cadenas literales, el compilador las optimiza.

Si embargo utilizar variables:

string a = "string1"; 
string b = "string2"; 
string c = a + b; 

Esto se hace en tiempo de ejecución.

+0

El "más de 4" solo es relevante al alternar sobre un conjunto de datos; de lo contrario, una sola llamada a string.Concat (pasando una matriz si es necesario) es idéntica. –

+0

Lo que dices es verdad. http://dotnetperls.com/Content/StringBuilder-Performance.aspx –

-3

StringBuilder será su enfoque más rápido si está utilizando cualquier cantidad de cadenas.

http://dotnetperls.com/Content/StringBuilder-1.aspx

Si se acaba de hacer unas pocas cuerdas (5 o menos es una buena regla) la velocidad no importa de qué tipo de concatenación que está utilizando.

+0

El generador de cadenas es la solución * runtime * más rápida, pero la expresión dada se evaluaría mejor en tiempo de compilación (lo que creo que no debería ser un problema para el compilador) – peterchen

0

Hay alguna manera de hacerlo. Mi beneficio utiliza un método de cuerda de C#. Ejemplo uno:

string s = string.Format ("{0} {1} {0}", "Hola", "Por"); resultado es s = "Hola por Hola";

Cuestiones relacionadas