Pregunta

En mis primeros días de programación .Net, solía string.Format () sólo para concatenaciones de cadenas complejas, por ejemplo, para compilar cadenas como

Problema con el pedido de un cliente 234 de fecha 2/2/2002 y el pago ID 55543.

Pero ahora uso string.Format para casi todos los concatenación de cadenas que tengo que hacer, también los simples tales como prefijo una cadena con algo.

Console.WriteLine(string.Format("\t\t{0}", myString));

¿Hay cualquier posible sobrecarga en esto? Tal vez debería usar el operador regular de + para hacer estas operaciones simples?

¿Cuál es su opinión al respecto?

¿Fue útil?

Solución

Para concatenaciones de cadenas simples de usar el enfoque +. Es claro que las cosas simples que no requieren un formato.

Para las cadenas más complejas que tienen un determinado formato y en los que es útil para mantener la estructura de la cadena entera y proporcionar un marcador de posición para la entrada, utilice String.Format.

Y sí, hay una sobrecarga. String.Format utiliza un StringBuilder debajo de las cubiertas. concatenaciones de cadenas simples serán mucho más rápido en esos escenarios. Un par de puntos de referencia y entradas de blog sobre este tema se puede encontrar con bastante facilidad. Por supuesto, todo depende de su uso. Si los pequeños concats cadena se están produciendo en un bucle y luego el uso repetido de String.Format probablemente será más notable que un concat + sencillo. Si usted está construyendo un grande cadena en un bucle y luego el ejemplo clásico es preferir StringBuilder y otras cuestiones conexas en concat frente StringBuilder se pueden encontrar en SO.

EDIT: Para aclarar, esto sirve de poco: String.Format("{0}{1}", a, b) ya que no es mucho el formato. Se trata simplemente de a + b. Por desgracia, me he encontrado con este tipo de ejemplos de código de producción y en cuanto veo String.Format espero ver algo que necesita ser estructurada de una manera determinada, no un concat sencillo.

otoh, tenga en cuenta este número de teléfono: "(" + area + ") " + number + " x" + extension - hay demasiado que hacer y no es fácil de modificar. En este caso, un String.Format es preferible: String.Format("({0}) {1} x{2}", area, number, extension). Esto sigue siendo un ejemplo trivial, pero se entiende la idea.

Otros consejos

También tienden a utilizar en la mayoría string.Format operación que necesitan dos o más cadenas / valores que deben combinarse, ya que produce más fácil de leer el código de arranque y parada con cadenas + 's en el medio.

Para ampliar

string value = string.Format("Hello {0}", user.username);

es mucho más fácil de leer y ampliable que

string value = "Hello" + user.username

Por ejemplo, si quiere añadir la última fecha de inicio de sesión como una actualización del sistema, simplemente podría ampliar el código a la siguiente

string value = string.Format("Hello {0}, you last logged in {1}", user.username, user.lastLogin);

concatenación simple es más eficiente para las cosas simples. Utilice String.Format() para cuando las cosas se ponen más complicadas y que hace que su código sea más fácil de leer.

Yo personalmente lo mismo (siempre y cuando la función que estoy llamando no maneja el formato para mí).


Clarrification

Para la concatenación de cadenas regular como "Hello " + "World!"; me gustaría utilizar un StringBuilder. Su ejemplo da formato a la cadena para la producción anteponiendo dos pestañas ... que considero más como el formato.

Hay una diferencia entre el formato y la concatenación ... tenga cuidado de lo que se utiliza para el cual.


String.Format() utiliza un StringBuilder internamente para la concatenación va a ser más eficiente que hacer la concatenación de cadenas regular de todos modos.

Es posible que desee cambiar su ejemplo ya Console.WriteLine() puede manejar el formato en sí (sin String.Format() es necesario):

Console.WriteLine("\t\t{0}", myString);

Mi regla es que si tengo que usar el + (concatenación) más de una vez lo cambio a un string.Format.

string a = "Something: " + x;   // ok

string b = "Something: " + x + " something else"; // change it to a string.Format
string bB = string.Format("Something: {0} something else", x); // much nicer to read

string c = "Something: " + x + " " + y + " " + z;  // Yuck
string cC = string.Format("Something: {0} {1} {2}", x, y, x);  // Much nicer

No sé sobre el rendimiento, alguien probablemente dispondrán que los datos, pero mi sensación es que String.Format es el camino a seguir si usted quiere poner la cadena de formato en su archivo de configuración (o un archivo de base de datos de campo o recurso o lo que sea). De esa manera, si desea modificar el número de pestañas, cambiar a espacios, agregar delimitadores, o lo que sea, no tiene que volver a compilar.

Yo tiendo a usar String.Concat en lugar de String.Format cuando sólo necesito prefijo o sufijo de una cadena dada. Yo prefiero la llamada explícita a la Concatmethod continuación, utilizar el operador + y si ya está acostumbrado String.Format Es sólo una cuestión de cambiar sólo presionar una tecla.

IIRC, el método String.Concat será el mismo que usar el operador por lo que también sea más rápido que String.Format.

Yo casi siempre uso el formato, aunque yo uso un método de extensión en lugar del método de cadenas estáticas. Me resulta más fácil de entender, fácil de cambiar, y generalmente más fáciles de mantener. También puede hacer que la localización más fácil, ya que no introduce problemas de ordenación de la manera concatenación hace.

Sinceramente, que se ve mejor?

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top