strings placeholders literal c# string formattable

c# - placeholders - Diferencia entre String, FormattableString, IFormattable



interpolation c# string (1)

FormattableString se ha introducido en C # 6.0. Como podemos usar el mismo formato de cadena usando el objeto de string ¿por qué es necesario usar FormattableString o IFormattable ? ¿Cuál es la diferencia entre tres?

Mi código

var name = "Pravin"; var s = $"Hello, {name}"; System.IFormattable s1 = $"Hello, {name}"; System.FormattableString s2 = $"Hello, {name}";

Sobre todo produce el mismo resultado. es decir, ''Hello Pravin''.

¿Puedo obtener una respuesta más elaborada sobre esto si alguien tiene un conocimiento profundo del mismo?


FormattableString es un tipo nuevo en .NET 4.6, y el compilador solo lo usará si intentas usarlo. En otras palabras, el tipo de un literal de cadena interpolada normalmente es una string , construida con una string.Format - pero puede ser FormattableString (a través de FormattableStringFactory ) si lo solicita.

Un FormattableString consta de la cadena de formato que se pasaría a string.Format (por ejemplo, "Hello, {0}" ) y los argumentos que se pasarían para formatearla. Fundamentalmente, esta información se captura antes de formatear.

Esto le permite ajustar el formato de manera adecuada, más comúnmente para realizarlo en la cultura invariante, a menudo con el método estático Invariant .

Cuando asigna un literal de cadena interpolada a una variable IFormattable , también usará FormattableString . La IFormattable.ToString(string, CultureInfo) ignora el primer argumento en este caso, que es probablemente el motivo por el que utiliza la implementación de la interfaz explícita.

Código de muestra:

using System; using System.Globalization; using System.Threading; using static System.FormattableString; class Test { static void Main() { var uk = CultureInfo.CreateSpecificCulture("en-GB"); Thread.CurrentThread.CurrentCulture = uk; var germany = CultureInfo.CreateSpecificCulture("de-DE"); string now = $"Default: it is now {DateTime.UtcNow}"; Console.WriteLine(now); // UK format IFormattable x = $"Specific: It is now {DateTime.UtcNow}"; Console.WriteLine(x.ToString("ignored", germany)); FormattableString y = $"FormattableString: It is now {DateTime.UtcNow}"; Console.WriteLine(FormattableString.Invariant(y)); // Via using static Console.WriteLine(Invariant($"It is now {DateTime.UtcNow}")); } }

Resultados de la muestra:

Default: it is now 16/02/2016 07:16:21 Specific: It is now 16.02.2016 07:16:21 FormattableString: It is now 02/16/2016 07:16:21 It is now 02/16/2016 07:16:21