¿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.
Respuestas:
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 .fuente
int
se 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.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.
Hay algunos resultados de pruebas de rendimiento https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
fuente
String::Format
. ya veces enString::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.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
string.Format
. Sin embargo, hay herramientas para eso (por ejemploReSharper
).Mantenibilidad (mi opinión)
string.Format
es 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.string.Format
es mucho menos propenso a esto.Entonces, en base a estos, decidí seguir con la
string.Format
mayor 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.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.Format
característica similar, por ejemplo, JavaScript.fuente
{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}"
vsstring.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)
string.Format
creo que son mucho menos propensos a este problema. Pero de todos modos, por eso enfaticé que es mi opinión :)