entender ejemplos c# c#-6.0

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.



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);