2016-02-16 17 views
19

FormattableString wurde in C# 6.0 eingeführt. Da wir dieselbe Zeichenkettenformatierung unter Verwendung des Objekts string verwenden können, ist es erforderlich, FormattableString oder IFormattable zu verwenden. Was ist der Unterschied zwischen drei? Unterschied zwischen String, FormattableString, IFormattable

My-Code

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

Vor allem produziert dort gleiches Ergebnis. d. h. 'Hello Pravin'.

Kann ich eine ausführlichere Antwort darauf erhalten, wenn jemand tiefes Wissen darüber hat.

Antwort

28

FormattableString ist ein neuer Typ in .NET 4.6, und der Compiler wird es nur verwenden, wenn Sie versuchen, es zu verwenden. Mit anderen Worten, der Typ eines interpolierten String-Literals ist normalerweise string - gebaut mit string.Format - kann aber FormattableString (über FormattableStringFactory) sein, wenn Sie danach fragen.

Ein FormattableString besteht aus der Formatzeichenfolge, die an string.Format übergeben würde (z. B. "Hello, {0}") und die Argumente, die übergeben werden, um es zu formatieren. Entscheidend ist, dass diese Information vor Formatierung erfasst wird.

Damit können Sie die Formatierung entsprechend anpassen - am häufigsten, um es in der invarianten Kultur durchzuführen, oft mit der Invariant static method. Wenn Sie einer Variablen IFormattable ein interpoliertes Zeichenfolgeliteral zuweisen, wird auch FormattableString verwendet. Die IFormattable.ToString(string, CultureInfo) implementation ignoriert das erste Argument in diesem Fall, weshalb vermutlich explizite Schnittstellenimplementierung verwendet wird.

Beispielcode:

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

Beispielergebnisse:

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 
+0

Vielen Dank für das @JonSkeet! –

+1

Da 'string'' IFormattable' nicht implementiert, ist die Verwendung von 'FormattableString' nur dann eine Option, wenn interpolierte Zeichenfolgen in' IFormattable' umgewandelt werden. – PetSerAl

+0

@PetSerAI: Du hast absolut recht. Nicht sicher, was ich dachte. Wird bearbeiten. Wenn ich ins Büro komme ... –