首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String、FormattableString、IFormattable之间的区别

String、FormattableString、IFormattable之间的区别
EN

Stack Overflow用户
提问于 2016-02-16 15:04:02
回答 2查看 20K关注 0票数 48

C# 6.0中引入了FormattableString。因为我们可以使用string对象进行相同的字符串格式化,所以为什么需要使用FormattableStringIFormattable。三个有什么不同?

我的代码

代码语言:javascript
复制
        var name = "Pravin";
        var s = $"Hello, {name}";
        System.IFormattable s1 = $"Hello, {name}";
        System.FormattableString s2 = $"Hello, {name}";

最重要的是,它们产生了相同的结果。即'Hello Pravin'.

如果有人对此有深入的了解,我能得到更详细的答案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-16 15:09:58

FormattableString是.NET 4.6中的一个新类型,只有在您尝试使用它时,编译器才会使用它。换句话说,插值字符串文字的类型通常是string -使用string.Format构建的-但如果您需要的话,也可以是FormattableString (通过FormattableStringFactory)。

FormattableString由将传递给string.Format的格式字符串(例如"Hello, {0}")和为格式化它而传递的参数组成。至关重要的是,这些信息是在格式化之前捕获的。

这允许您适当地调整格式-最常见的是在固定区域性中执行它,通常使用Invariant static method

当你给一个IFormattable变量赋值一个插值字符串文字时,它也会使用FormattableString。在这种情况下,IFormattable.ToString(string, CultureInfo) implementation忽略了第一个参数,这可能是它使用显式接口实现的原因。

示例代码:

代码语言:javascript
复制
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}")); 
    }
}

示例结果:

代码语言:javascript
复制
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
票数 68
EN

Stack Overflow用户

发布于 2020-04-21 02:51:19

顺便说一句,https://www.meziantou.net/interpolated-strings-advanced-usages.htm涵盖了FormattableString允许您做的一些示例(例如,自动参数化SQL语句)

例如:

代码语言:javascript
复制
void ExecuteNonQuery(DbConnection connection, FormattableString formattableString)
{
    using (var command = connection.CreateCommand())
    {
        // Replace values by @p0, @p1, @p2, ....
        var args = Enumerable.Range(0, formattableString.ArgumentCount).Select(i => (object)("@p" + i)).ToArray();

        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = string.Format(formattableString.Format, args);

        // Create parameters
        for (var i = 0; i < formattableString.ArgumentCount; i++)
        {
            var arg = formattableString.GetArgument(i);
            var p = command.CreateParameter();
            p.ParameterName = "@p" + i;
            p.Value = arg;
            command.Parameters.Add(p);
        }

        // Execute the command
        command.ExecuteNonQuery();
    }
}

using (var sqlConnection = new SqlConnection())
{
    sqlConnection.Open();
    ExecuteNonQuery(sqlConnection, $@"UPDATE Customers SET Name = {"Meziantou"} WHERE Id = {1}");
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35425899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档