2010-06-11 26 views
21

I m curiosidad por qué debería utilizar el formato de cadenas mientras pueda utilizar la concatenación comoC# formato de cadenas

Console.WriteLine("Hello {0} !", name); 

Console.WriteLine("Hello "+ name + " !"); 

Por qué preferir el primero sobre el segundo?

+5

realmente una respuesta completa, pero con un ejemplo más, la elegancia de la primero se vuelve mucho más claro, el segundo se vuelve bastante feo después de algunas variables. –

+0

posible duplicado de [C# String output: format o concat?] (Http://stackoverflow.com/questions/16432/c-sharp-string-output-format-or-concat) – nawfal

+0

Posible duplicado de [String output: format o concat en C#?] (https://stackoverflow.com/questions/16432/string-output-format-or-concat-in-c) – DaveInCaz

Respuesta

57

Usted escogió demasiado simple de un ejemplo.

El formato de cadenas:

  • le permite utilizar la misma variable varias veces: ("{0} + {0} = {1}", x, 2*x)
  • automáticamente las llamadas de ToString en sus argumentos: ("{0}: {1}", someKeyObj, someValueObj)
  • le permite especificar el formato: ("The value will be {0:3N} (or {1:P}) on {2:MMMM yyyy gg}", x, y, theDate)
  • que permite para configurar el relleno fácilmente: (">{0,3}<", "hi"); // ">hi <"
+0

Bien, no sabía que también podrías usar cadenas de formato. – Mathias

+1

+1 gran respuesta, muy completa –

+0

Wow, ni siquiera consideré todo eso. (Sin embargo, he usado la mayoría de esas características). +1 – strager

2

El formato de cadena le permite mantener la cadena de formato separada, y usarla donde se necesita sin tener que preocuparse por la concatenación.

string greeting = "Hello {0}!"; 
Console.WriteLine(greeting, name); 

cuanto a por qué se usaría en el ejemplo exacto que dio ... fuerza de la costumbre, la verdad.

+0

En circunstancias excepcionales, también por problemas de rendimiento/recursos. 'string.format' utiliza StringBuilder, que es conocido por ser una mejora en muchas concatenaciones. –

+0

mismo de nuevo, puedo tener una declaración equivalente, que puedo hacer con la concatenación. Pero mencionar el rendimiento es una ventaja, supongo. – DarthVader

+1

Hasta que intente traducir el saludo. Entonces la concatenación cae en su keister. –

12

Puede el comercio de la cadena para una cadena dinámica más tarde.

Por ejemplo:

// In a land far, far away 
string nameFormat = "{0} {1}"; 

// In our function 
string firstName = "John"; 
string lastName = "Doe"; 

Console.WriteLine(nameFormat, firstName, lastName); 

Aquí, se puede cambiar a, por ejemplo nameFormat"{1}, {0}" y no necesita cambiar ninguno de sus otros códigos. Con la concatenación, necesitaría editar su código o posiblemente duplicar su código para manejar ambos casos.

Esto es útil en localización/internacionalización.

+1

+1 para "Esto es útil en localización/internacionalización". –

1

Está utilizando un ejemplo trivial en el que no hay mucha diferencia. Sin embargo, si tiene una cadena larga con muchos parámetros, es mucho mejor usar una cadena de formato en lugar de muchos, muchos signos y saltos de línea.

También permite dar formato a los datos numéricos como desee, es decir, moneda, fechas, etc.

1

Se recomienda el primer formato. Le permite especificar formatos específicos para otros tipos, como mostrar un valor hexadecimal o mostrar algún formato de cadena específico.

p. Ej.

string displayInHex = String.Format("{0,10:X}", value); // to display in hex 

También es más consistente. Puede usar la misma convención para mostrar su declaración Debug. p.

Debug.WriteLine (String.Format("{0,10:X}", value)); 

Por último, pero no menos importante, ayuda en la localización de su programa.

1

Además de razones como la de Ignacio, muchos (incluido yo) encuentran que el código basado en String.Format es mucho más fácil de leer y modificar.

string x = String.Format(
    "This file was last modified on {0} at {1} by {2}, and was last backed up {3}." 
    date, time, user, backupDate); 

vs

string x = "This file was last modified on " + date + " at " 
+ time + " by " + user + " and was last backed up " + backupDate + "."; 
2

Creo que un buen ejemplo es en la i18n y l10n

Si tiene que cambiar una cadena entre los diferentes idiomas, esto: "bla "+ variables +" bla bla ... " Dará problemas a un programa usado para crear sobstitution para sus cadenas si usa un idioma diferente

mientras está de esta manera:" bla {0} blabla "es fácilmente convertible (obtendrás {0} como parte de la cadena)

1

He encontrado que el enfoque anterior (usando string.format) es muy útil al anular los métodos ToString() en las clases de entidad.

Por ejemplo, en mi clase de producto;

public override string ToString() 
{ 
    return string.format("{0} : {1} ({2}/{3}/{4}", 
           this.id, 
           this.description, 
           this.brand, 
           this.model); 
} 

Entonces, cuando los usuarios deciden que quieren que aparezca el producto de manera diferente que es fácil cambiar el orden/contenido o diseño de la cadena que se devuelve.

Por supuesto que aún concatena esta cadena pero siento que string.Format hace que todo sea un poco más legible y mantenible.

Creo que esa es la respuesta corta que estoy dando, ¿no es así? Legibilidad y facilidad de mantenimiento para cadenas largas o complejas.

6

No hay una respuesta correcta singular a esta pregunta. Hay algunas cuestiones que desea tratar:

Rendimiento

Las diferencias de rendimiento en sus ejemplos (y en aplicaciones reales) son mínimos. Si comienza a escribir MUCHAS concatenaciones, verá gradualmente un mejor rendimiento de memoria con la cadena formateada. Consulte la Ben's answer

legibilidad

Va a ser mejor con una cadena con formato cuando se tiene el formato, o tiene muchas variables diferentes a stringify:

string formatString = "Hello {0}, today is {1:yyyy-MM-dd}"; 
Console.WriteLine(formatString, userName, Date.Today); 

extensibilidad

Tu situación determinará qué es lo mejor.Usted me dice que es mejor cuando es necesario agregar un elemento entre nombre de usuario y Tiempo en el registro:

Console.WriteLine(
    @"Error! 
    Username: " + userName + " 
    Time: " + time.ToString("HH:mm:ss") + " 
    Function: " + functionName + " 
    Action: " + actionName + " 
    status: " + status + " 
    ---"); 

o

Console.WriteLine(@"Error! 
    Username: {0} 
    Time: {1} 
    Function: {2} 
    Action: {3} 
    status: {4} 
    ---", 
    username, time.ToString("HH:mm:ss"), functionName, actionName, status); 

Conclusión

yo elegiría la cadena formateada la mayor parte del tiempo ... Pero no dudaría en utilizar la concatenación cuando fuera más fácil.

+0

Respuesta muy completa. +1 – Syd

2

El formato se suele preferir por la mayoría de las razones explicadas por otros miembros aquí. Hay un par de razones más que deseo aprovechar de mi corta experiencia en programación:

  • El formateo ayudará a generar cadenas con conciencia cultural.
  • El formateo es más eficaz que la concatenación. Recuerde, cada operación de concatenación implicará la creación de cadenas intermedias temporales. Si tiene un montón de cadenas que necesita concatenar, es mejor utilizar String.Join o StringBuilder.
0

Creo que lo principal aquí es legibilidad. Así que siempre elijo lo que tenga la mejor legibilidad para cada caso.

Nota:

Con la interpolación de cadenas de C# 6 su código podría simplificarse en esto:

Console.WriteLine($"Hello {name}!"); 

Lo cual me parece mejor que sus dos opciones sugeridos.

0

Desde la liberación de C# 6 hace algunos años, también es posible realizar la interpolación de cadenas. Por ejemplo, esto:

var n = 12.5847; 
System.Console.WriteLine(string.Format("Hello World! {0:C2}", n)); 

Se convierte en lo siguiente:

var n = 12.5847; 
System.Console.WriteLine($"Hello World! {n:C2}"); 

Y tanto le da a este resultado:

Hello World! £12.58 
No
Cuestiones relacionadas