2011-01-12 20 views
8

En C# es posible concatenar cadenas de varias maneras diferentes:¿Cuándo debería usar String.Format o String.Concat en lugar del operador de concatenación?

Usando el operador de concatenación:

var newString = "The answer is '" + value + "'."; 

Usando String.Format:

var newString = String.Format("The answer is '{0}'.", value); 

Usando String.Concat:

var newString = String.Concat("The answer is '", value, "'."); 

¿Cuáles son las ventajas/desventajas de cada uno de estos métodos? ¿Cuándo debería preferir uno sobre los demás?

La pregunta surge debido a un debate entre los desarrolladores. Un nunca usa String.Format para la concatenación: argumenta que esto es para formatear cadenas, no para concatenación, y que siempre es ilegible porque los elementos en la cadena se expresan en el orden incorrecto. El otro frecuentemente usa String.Format para la concatenación, porque cree que hace que el código sea más fácil de leer, especialmente cuando hay varios conjuntos de comillas involucrados. Ambos desarrolladores también usan el operador de concatenación y String.Builder también.

Respuesta

16

En cuanto a la velocidad es casi siempre doesn't matter.

var answer = "Use what makes " + "the code most easy " + "to read"; 
+0

+1 para contrarrestar el downvote inmerecido. – LukeH

+0

Sí, buen enlace +1. – StuartLC

+4

El uso de la concatenación de cadenas a menudo produciría muchos objetos pequeños en la memoria, lo que podría afectar negativamente el rendimiento de la recolección de elementos no utilizados. Es muy difícil medir dicho efecto mediante la prueba de su enlace, pero podría ser un problema de rendimiento muy grande para sistemas grandes con requisitos de rendimiento exigentes. –

2

Las consideraciones de rendimiento a menudo son el motivo de esta decisión. Vea el artículo this de Ayende.

0

No es recomienda para almacenar cadena en código por lo que si se decide extraer sus secuencias de código a continuación, con String.Format que sería más fácil hacer

+1

¿Por qué no? Aprecio que esto puede ser un problema si anticipa la internacionalización, pero para muchas aplicaciones esto nunca es una consideración. – Kramii

+0

Nunca digas nunca :) –

3

lo general el uso string.Format cuando estoy he encadenando más de 2 o 3 valores, ya que hace que sea más fácil ver cómo se vería el resultado final. Concatenar las cadenas es lento, ya que necesita crear un nuevo objeto de cadena para cada operación.

Si necesita unir más de 5 cadenas, use StringBuilder ya que sería mucho más rápido.

+1

Propongo que String.Concat utilice StringBuilder, así que creo que el argumento de rendimiento falla aquí –

+1

De hecho. Si el argumento es sobre el rendimiento relativo de 'Concat' y' Format', 'Concat' ganará todas las veces, a menos que esté haciendo algo loco. – LukeH

3

Normalmente voy por la legibilidad, y tendería a utilizar Formato. La mayoría de los códigos se escriben una vez y se leen varias veces, por lo que es más importante (para mí) asegurarse de que el lector pueda entender rápidamente lo que se está diciendo.

3

Es curioso, pero String.Format utiliza internamente StringBuilder.AppendFormat(). Por ejemplo, el código String.Format está buscando como:

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    if (format == null || args == null) 
    throw new ArgumentNullException((format == null ? "format" : "args")); 

    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); 
    builder.AppendFormat(provider, format, args); 
    return builder.ToString(); 
} 

Más información este se puede encontrar here. Entonces, ¿por qué no hemos mencionado aquí sobre StringBuilder.AppendFormat()!

En cuanto al punto principal de la pregunta: ¿

La clave es escoger la mejor herramienta para el trabajo. ¿Que quiero decir?Tenga en cuenta estas tremendas palabras de sabiduría:

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building. 
* Format is best at formatting. 
0

Este es un artículo sobre el uso de memoria para diferentes métodos de concatenación y optimizaciones del compilador utilizado para generar la IL. Concatenation methods and optimization issue

+1

Está bien vincular al artículo, pero es mejor extraer la información seleccionada y publicarla aquí. Si ese blog se va/se traslada algún día, se convierte en una respuesta inútil. – Mike

Cuestiones relacionadas