FormattableString已在C#6.0中引入。由于我们可以使用string对象使用相同的字符串格式,因此为什么需要使用FormattableStringIFormattable。两者之间有什么区别?

我的密码

        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/

10-12 05:28