una longitud interpolacion extraer ejemplos caracteres cadenas cadena c# string-formatting roslyn c#-6.0

interpolacion - longitud de una cadena en c#



¿Cómo se compila la interpolación de cadenas C#? (1)

Se compila de una de dos maneras.

Si utiliza una expresión de interpolación de cadena donde se espera una string , se compila en una llamada a string.Format .

Básicamente, esto:

string s = $"now is {DateTime.Now}";

se convierte en esto:

string s = string.Format("now is {0}", DateTime.Now);

Véalo usted mismo en Try Roslyn .

Nada mágico aquí.

Ahora, por otro lado, si lo usa en un lugar donde se FormattableString un FormattableString (un nuevo tipo en .NET 4.6), se compila en una llamada a FormattableStringFactory.Create :

public void Test(FormattableString s) { } Test($"now is {DateTime.Now}");

La llamada allí se convierte en esto:

Test(FormattableStringFactory.Create("now is {0}", DateTime.Now));

Véalo usted mismo en Try Roslyn .

Así que, en esencia, para responder a su pregunta final allí:

Esta llamada:

Print($"{foo} {bar}");

Será traducido a esto:

Print(string.Format("{0} {1}", foo, bar));

lo que incurrirá en el costo del formato a través de la string.Format antes de que incluso se llame a Print .

Si pudiera agregar, o encontrar, una sobrecarga de Print que tome un FormattableString , entonces podría aplazar el costo real de la string.Format hasta que haya averiguado si necesita iniciar sesión. Es difícil decir si esto tiene una medida diferente en tiempo de ejecución.

Véalo usted mismo en Try Roslyn .

Ronda de bonos

No solo se difiere el formato real, sino que el método FormattableString de FormattableString permite especificar un IFormatProvider .

Esto significa que también puede diferir la transformación localizada.

public static void Print(FormattableString s) { Console.WriteLine("norwegian: " + s.ToString(CultureInfo.GetCultureInfo("nb-NO"))); Console.WriteLine("us: " + s.ToString(CultureInfo.GetCultureInfo("en-US"))); Console.WriteLine("swedish: " + s.ToString(CultureInfo.GetCultureInfo("sv-SE"))); }

Sé que la interpolación es azúcar sintáctica para string.Format() , pero ¿tiene algún comportamiento / reconocimiento especial cuando se utiliza con un método de formato de string?

Si tengo un método:

void Print(string format, params object[] parameters)

Y la siguiente llamada a ella mediante interpolación:

Print($"{foo} {bar}");

¿Cuál de las siguientes líneas de llamadas es más equivalente al resultado compilado de la interpolación de cadenas?

Print(string.Format("{0} {1}", new[] { foo, bar })); Print("{0} {1}", new[] { foo, bar });

Razonamiento detrás de la pregunta: los marcos de registro como NLog por lo general aplazan el formato de cadena hasta que determinan que realmente se escribirá un mensaje de registro. En general, prefiero la sintaxis de interpolación de cadenas, pero necesito saber si puede incurrir en una penalización de rendimiento adicional.