una por leer interpolacion extraer ejemplos caracteres caracter cadenas cadena c# code-formatting

por - string format c#



Declarar cadenas largas que utilizan la interpolaciĆ³n de cadenas en C#6 (4)

Usualmente envuelvo cuerdas largas concatenándolas:

Log.Debug("I am a long string. So long that I must " + "be on multiple lines to be feasible.");

Esto es perfectamente eficiente, ya que el compilador maneja la concatenación de literales de cadena. También considero que es la forma más limpia de manejar este problema ( las opciones se consideran aquí ).

Este enfoque funcionó bien con String.Format :

Log.Debug(String.Format("Must resize {0} x {1} image " + "to {2} x {3} for reasons.", image.Width, image.Height, resizedImage.Width, resizedImage.Height));

Sin embargo, ahora deseo nunca volver a usar String.Format en estas situaciones, ya que la interpolación de cadenas de C # 6 es mucho más legible. Mi preocupación es que ya no tengo una forma eficiente y limpia de formatear cadenas largas.

Mi pregunta es si el compilador de alguna manera puede optimizar algo como

Log.Debug($"Must resize {image.Width} x {image.Height} image " + $"to {resizedImage.Width} x {resizedImage.Height} for reasons.");

en el String.Format equivalente anterior o si hay un enfoque alternativo que puedo usar que no será menos eficiente (debido a la concatenación innecesaria) al mismo tiempo que mantengo mi código perfectamente estructurado (según los puntos planteados en el enlace anterior).


Actualmente, ese tipo de optimización parece imposible.

Este programa:

var name = "Bobby Tables"; var age = 8; String msg = $"I''m {name} and" + $" I''m {age} years old";

Se compila como si hubieras escrito:

var name = "Bobby Tables"; var age = 8; String msg = String.Concat(String.Format("I''m {0} and", name), String.Format(" I''m {0} years old", age));

Ves la dificultad de deshacerte de Concat : el compilador ha reescrito nuestros literales de interpolación para usar los formateadores indexados que String.Format espera, pero cada cadena debe numerar sus parámetros desde 0. La concatenación ingenua de ellos hará que ambos inserte el name Para que esto funcione correctamente, tendría que mantenerse el estado entre las invocaciones del $ parser para que la segunda cadena se reformatee como " I''m {1} years old" . Alternativamente, el compilador podría intentar aplicar el mismo tipo de análisis que hace para la concatenación de literales de cadena. Creo que esta sería una optimización legal, aunque la interpolación de cadenas puede tener efectos secundarios, pero no me sorprendería si resultara que hubo un caso de esquina en el que la concatenación de cadenas interpolada cambió el comportamiento del programa. Ninguno de los dos parece imposible, especialmente teniendo en cuenta que la lógica ya está ahí para detectar una condición similar para los literales de cadena, pero puedo ver por qué esta característica no llegó al primer lanzamiento.

Escribiría el código de la manera que usted crea que es más limpio y legible, y no me preocuparía por las micro-ineficiencias a menos que resulten ser un problema. El viejo dicho de que el código es principalmente para que los humanos lo entiendan se sostiene aquí.


En c # 6.0:

var planetName = "Bob"; var myName = "Ford"; var formattedStr = $"Hello planet {planetName}, my name is {myName}!"; // formattedStr should be "Hello planet Bob, my name is Ford!"

Luego concatenar con stringbuilder:

StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(formattedStr); // Then add the strings you need

Añadir más cadenas a stringbuilder .....


En el caso especializado de usar esta cadena en HTML (o analizar con cualquier analizador donde no importen los espacios en blanco múltiples), podría recomendarle que use cadenas @$"" (cadena interpolada literal), por ejemplo:

$@"some veeeeeeeeeeery long string {foo} whatever {bar}"


Tal vez no sea tan legible como con + pero, por todos los medios, es posible. Solo tienes que romper la línea entre { y } :

Log.Debug($@"Must resize {image.Width} x {image.Height} image to { resizedImage.Width} x {resizedImage.Height} for reasons.");

El script para colorear de SO no maneja esta sintaxis demasiado bien, pero el compilador C # lo hace ;-)