entender - string c# ejemplos
InterpolaciĆ³n de cadenas con variable de formato (5)
Puedo hacer esto:
var log = string.Format("URL: {0}", url);
o incluso así
var format = "URL: {0}";
...
var log = string.Format(format, url);
Tengo un
format
definido en otro lugar y uso la variable de
format
, no la cadena en línea.
En C # 6, esto parece imposible:
var format = $"URL: {url}"; // Error url does not exist
...
var url = "http://google.com";
...
var log = $format; // The way to evaluate string interpolation here
¿Hay alguna forma de utilizar la interpolación de cadenas con la variable declarada anteriormente?
C # 6 parece interpolar la cadena en línea durante el tiempo de compilación.
Sin embargo, considere usar esta función para la localización, defina un formato en la configuración o simplemente tener un formato
const
en una clase.
La interpolación de cadenas es una característica del compilador, no de la biblioteca.
Los agujeros no son nombres, sino expresiones:
var r = new Rectangle(5, 4);
var s = $"area: {r.Width + r.Heigh}":
¿Cómo haría eso para la localización, como pretende?
Incluso
r
solo existe en tiempo de compilación.
En IL es solo una posición en la pila de variables del método.
He hecho lo que pretendes hacer por los recursos y los archivos de configuración.
Como solo puede tener un conjunto finito de "variables" para sustituir, lo que hice fue tener una matriz (o diccionario, si lo prefiere) y usar una expresión regular para reemplazar los nombres en los agujeros con su índice. Lo que incluso permití para los especificadores de formato.
Más de una idea que de una respuesta.
Para el ejemplo que se muestra en la pregunta, puede hacer lo siguiente.
var format = "URL: ";
...
var url = "http://google.com";
...
var result= $"{format} {url}";
Tengo un proyecto real en el que tengo que hacer mucho algo como esto:
var label = "Some Label";
var value = "SomeValue";
//both label & value are results of some logic
var result = $"{label}: {value}";
No, no puede usar la interpolación de cadenas con otra cosa que no sea un literal de cadena, ya que el compilador crea una cadena de formato "normal" incluso cuando usa la interpolación de cadenas.
Porque esto:
string name = "bar";
string result = $"{name}";
se compila en esto:
string name = "bar";
string result = string.Format("{0}", name);
la cadena en tiempo de ejecución debe ser una cadena de formato "normal" y no el equivalente de interpolación de cadenas.
Puede usar el viejo
String.Format
simple en
String.Format
lugar.
Parece que puedes hacerlo así:
var googleUrl = "http://google.com";
var url = $"URL: {googleUrl}";
System.Console.WriteLine(url);
Puede consultar para obtener más detalles en https://msdn.microsoft.com/en-us/library/dn961160.aspx
Un enfoque para evitar esto sería utilizar una lambda que contenga la cadena interpolada. Algo como:
Func<string, string> formatter = url => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);
En C # 7.0, podría usar una función local en lugar de una lambda, para hacer que el código sea un poco más simple y más eficiente:
string formatter(string url) => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);