Interpolación de cadenas vs String.Format

113

¿Existe una diferencia de rendimiento notable entre el uso de la interpolación de cadenas?

myString += $"{x:x2}";

vs String.Format ()?

myString += String.Format("{0:x2}", x);

Solo pregunto porque Resharper está solicitando la solución, y me han engañado antes.

Krythic
fuente
4
¿Por qué no probar ambos y ver si nota la diferencia?
Blorgbeard sale el
57
@Blorgbeard Honestamente, soy un vago. Y me imagino que tomaría menos tiempo si uno de ustedes, hombres / mujeres honrados, supiera la respuesta de inmediato.
Krythic
26
Me encanta cómo cuando hice esta pregunta por primera vez, la votación fue rechazada para el olvido y ahora, dos años después, sube a +21.
Krythic
46
Seriamente. ¿Cómo puede alguien dudar de la utilidad de esta pregunta? ¿Te imaginas la pérdida total de horas de trabajo si todos los que hicieran esta pregunta tuvieran que "intentarlo ellos mismos y ver?" Incluso si solo tomó 5 minutos, multiplique eso entre los más de 10,000 desarrolladores que han visto esta pregunta hasta ahora. Y luego, ¿qué haces cuando un compañero de trabajo duda de tus resultados? ¿Hazlo todo de nuevo? O tal vez simplemente refiéralos a esta publicación SO. Eso es algo para lo que está ahí.
BTownTKD
8
@BTownTKD Ese es el comportamiento típico de Stackoverflow para usted. Si alguien usa el sitio para su propósito previsto, se aliena de inmediato. Esta es también una de las razones por las que creo que deberíamos poder prohibir colectivamente las cuentas. Muchas personas simplemente no merecen estar en este sitio.
Krythic

Respuestas:

72

Notable es relativo. Sin embargo: la interpolación de cadenas se convierte en string.Format()tiempo de compilación, por lo que deberían terminar con el mismo resultado.

Sin embargo, existen diferencias sutiles: como podemos deducir de esta pregunta, la concatenación de cadenas en el especificador de formato da como resultado una string.Concat()llamada adicional .

Jeroen Vannevel
fuente
4
En realidad, la interpolación de cadenas podría compilarse en concatenación de cadenas en algunos casos (por ejemplo, cuando intse usa a). var a = "hello"; var b = $"{a} world";se compila para la concatenación de cadenas. var a = "hello"; var b = $"{a} world {1}";compila en formato de cadena.
Omar Muscatello
5

la interpolación de cadenas se convierte en string.Format () en tiempo de compilación.

También en string.Format puede especificar varias salidas para un solo argumento y diferentes formatos de salida para un solo argumento. Pero la interpolación de cadenas es más legible, supongo. Eso depende de ti.

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

Hay algunos resultados de pruebas de rendimiento https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a

Pablo
fuente
2
la interpolación de cadenas a veces se convierte en String::Format. ya veces en String::Concat. Y la prueba de rendimiento en esa página no es realmente significativa: la cantidad de argumentos que pasa a cada uno de esos métodos depende. concat no siempre es el más rápido, el constructor de cadenas no siempre es el más lento.
Matthias Burger
3

La pregunta era sobre el rendimiento, sin embargo, el título solo dice "vs", así que siento que tengo que agregar algunos puntos más, aunque algunos de ellos tienen opiniones.

  • Localización

    • La interpolación de cadenas no se puede localizar debido a su naturaleza de código en línea. Antes de la localización se ha convertido en string.Format. Sin embargo, hay herramientas para eso (por ejemplo ReSharper).
  • Mantenibilidad (mi opinión)

    • string.Formates mucho más legible, ya que se centra en la oración que me gustaría expresar, por ejemplo, al construir un mensaje de error agradable y significativo. El uso de {N}marcadores de posición me da más flexibilidad y es más fácil modificarlo más tarde.
    • Además, el especificador de formato en línea en la interploración es fácil de leer mal y fácil de eliminar junto con la expresión durante un cambio.
    • Cuando se utilizan expresiones complejas y largas, la interpolación se vuelve rápidamente aún más difícil de leer y mantener, por lo que, en este sentido, no se escala bien cuando el código evoluciona y se vuelve más complejo. string.Formates mucho menos propenso a esto.
    • Al final del día, se trata de separar las preocupaciones: no me gusta mezclar cómo debe presentarse con qué debe presentarse .

Entonces, en base a estos, decidí seguir con la string.Formatmayor parte de mi código. Sin embargo, he preparado un método de extensión para tener una forma más fluida de codificar que me gusta mucho más. La implementación de la extensión es de una sola línea, y se ve simplemente así en uso.

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

La interpolación es una gran característica, no me malinterpretes. Pero en mi opinión, brilla mejor en aquellos lenguajes que pierden la string.Formatcaracterística similar, por ejemplo, JavaScript.

Zoltán Tamási
fuente
Gracias por agregar a esto.
Krythic
1
No estoy de acuerdo con la mantenibilidad; concedido ReSharper hace que sea algo más fácil hacer coincidir los valores insertados con sus índices correspondientes (y viceversa) pero creo que aún es más carga cognitiva averiguar si {3}es X o Y, especialmente si comienzas a reorganizar tu formato. Ejemplo de Madlibs: $"It was a {adjective} day in {month} when I {didSomething}"vs string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)-> $"I {didSomething} on a {adjective} {month} day"vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
drzaus
@drzaus Gracias por compartir sus pensamientos. Tiene buenos puntos, sin embargo, es cierto solo si usamos solo variables locales simples y bien nombradas. Lo que he visto muchas veces son expresiones complejas, llamadas a funciones, lo que sea que se ponga en una cadena interpolada. Con string.Formatcreo que son mucho menos propensos a este problema. Pero de todos modos, por eso enfaticé que es mi opinión :)
Zoltán Tamási