FormattableString
是 .NET 4.6 中的一种新类型,编译器只有在你尝试使用它时才会使用它。换句话说,插值字符串文字的类型通常是string
- 用 - 构建的- 但如果您要求它string.Format
可以是FormattableString
(via )。FormattableStringFactory
AFormattableString
由将传递给string.Format
(例如"Hello, {0}"
)的格式字符串和将传递以对其进行格式化的参数组成。至关重要的是,此信息在格式化之前被捕获。
这允许您适当地调整格式 - 最常见的是在不变的文化中执行它,通常使用Invariant
static 方法。
当您将插值字符串文字分配给IFormattable
变量时,它也将使用FormattableString
。在这种情况下,IFormattable.ToString(string, CultureInfo)
实现忽略了第一个参数,这可能是它使用显式接口实现的原因。
示例代码:
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}"));
}
}
样本结果:
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