FormattableString
已在C#6.0中引入。由于我们可以使用string
对象使用相同的字符串格式,因此为什么需要使用FormattableString
或IFormattable
。两者之间有什么区别?
我的密码
var name = "Pravin";
var s = $"Hello, {name}";
System.IFormattable s1 = $"Hello, {name}";
System.FormattableString s2 = $"Hello, {name}";
最重要的是,产生相同的结果。即
'Hello Pravin'.
如果有人对此有深入的了解,我是否可以对此进行更详尽的解答。
最佳答案
FormattableString
是.NET 4.6中的一种新类型,只有尝试使用它时,编译器才会使用它。换句话说,内插字符串文字的类型通常是string
-用string.Format
构建-但是如果需要,可以是FormattableString
(通过FormattableStringFactory
)。FormattableString
由将传递给string.Format
的格式字符串(例如"Hello, {0}"
)和为对其进行格式化而传递的参数组成。至关重要的是,此信息是在格式化之前捕获的。
这使您可以适当地调整格式设置-最常见的是在不变文化中执行,通常使用 Invariant
static method。
当您将内插字符串文字分配给IFormattable
变量时,也将使用FormattableString
。在这种情况下, IFormattable.ToString(string, CultureInfo)
implementation会忽略第一个参数,这大概就是为什么它使用显式接口(interface)实现的原因。
样例代码:
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
关于c# - String,FormattableString,IFormattable之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35425899/