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
Vielen Dank für das @JonSkeet! –
Da 'string'' IFormattable' nicht implementiert, ist die Verwendung von 'FormattableString' nur dann eine Option, wenn interpolierte Zeichenfolgen in' IFormattable' umgewandelt werden. – PetSerAl
@PetSerAI: Du hast absolut recht. Nicht sicher, was ich dachte. Wird bearbeiten. Wenn ich ins Büro komme ... –