为什么要用内插字符串代替string.format

知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用string.format超5个以上占位符,那其中的痛苦我想你肯定是能够共鸣的。

一:痛苦经历

先上一段曾今写过的一段代码,大家来体会一下:

    LogHelper.WriteLog(string.Format(@"=== Square发送服务中  === 【第四步】 leaflet发送成功。marketID={0},
                                       marketName={1}, 总共客户:{2}, 成功:{3}人, 失败:{4}人,重复:{5}人,
                                       当前优先级:{6},所属shopID={7}",
                                      leafletEntity.MarketingID, leafletEntity.MarketingName,
                                      leafletEntity.CustomerList.Count,leafletEntity.SuccessCount,
                                      leafletEntity.FailCount, leafletEntity.RepeatCustomerNum,
                                      leafletEntity.Priority, leafletEntity.ShopID));

这里拥有多达8个占位符,当年写这个的时候,会有三个痛点。

1. 占位符不能写错了

比如这里的 {0},{1},{2}.... 不能写成了 {0},{0},{2},造成结果的重复输出。

2. 参数值个数不能多也不能少

比如把最后的leafletEntity.ShopID 参数值给丢了,造成8个占位符,7个参数的现象,这样就会造成系统抛异常。

3. 参数值顺序不能错

参数值个数多了,很难保证顺序没被搞错,比如这里的leafletEntity.FailCount和leafletEntity.RepeatCustomerNum,颠倒为leafletEntity.RepeatCustomerNum和leafletEntity.FailCount,你能一眼看出来吗???

二:解决办法

string.format也是曾今模仿C语言留下来的历史遗留问题,如今C#6.0出来了这个内插字符串完美的解决了这三个问题,简直不要太兴奋,接下来把文章开头处改成内插版。

            LogHelper.WriteLog($@"=== Square发送服务中  === 【第四步】 leaflet发送成功。
                                  marketID={leafletEntity.MarketingID},
                                  marketName={leafletEntity.MarketingName},
                                  总共客户:{leafletEntity.CustomerList.Count},
                                  成功:{leafletEntity.SuccessCount}人,
                                  失败:{leafletEntity.FailCount}人,
                                  重复:{leafletEntity.RepeatCustomerNum}人,
                                  当前优先级:{leafletEntity.Priority},
                                  所属shopID={leafletEntity.ShopID}");

内插字符串法仅仅就是在字符串前面加上"$"即可,给点时间大家仔细品味一下,是不是很好的解决了我之前提到的3个痛点。

1. 三目运算符在内插法的使用

很多时候在业务开发中,不能仅仅是填充一个变量,而最好还应该支持一些表达值,如使用最多的三目运算符

<1 style="box-sizing: border-box;"> 错误使用方式

如果你直接这么写,通过不了狠毒的编译器,比如下面这样。

<2 style="box-sizing: border-box;"> 正确使用方式

解决方法也能简单,在外围加上一个()即可。

2. 复杂逻辑的内插法使用

如果你有复杂的业务逻辑,建议单独另起一个方法。

    class Program
    {
        static void Main(string[] args)
        {
            var num = 10;

            var info = $"i={GetNum(num)}";
        }

        public static int GetNum(int num)
        {
            return num == 10 ? 1 : 2;
        }
    }

如何你的业务逻辑相对比较简单,可以用内联委托的方式实现。

三:探究原理

接下来探究一下,内插字符串这种语法糖在IL层面到底是个啥玩意,你可以通过ILSpy工具查看IL代码。

从上面的截图来看,其实所谓的“内插字符串”就是string.format,编译器的语法糖而已

注意点:

因为有一个box操作,所以你要当点心,如果Console.WriteLine多次执行会有一定的性能损失,建议提前做好box操作,例如下面这样。

        static void Main(string[] args)
        {
            int i = 1, j = 2, k = 3;

            var it = i.ToString();
            var jt = j.ToString();
            var kt = k.ToString();

            for (int m = 0; m < int.MaxValue; m++)
            {
                Console.WriteLine($"i={it},j={jt},k={kt}");
            }
        }

好了,本篇就说到这里,希望对你有帮助。

String.format是一个Java中的方法,用于格式化字符串。它可以通过传入格式字符串和参数来生成格式化的字符串。常用的占位符类型包括%s、%d、%f等。其中%s用于字符串类型,%d用于整数类型,%f用于浮点类型,%c用于字符类型,%b用于布尔类型,%n用于换行符。这些占位符可以根据需要动态地填充不同的数据。 举个例子,使用String.format可以将一些变量值动态地插入到字符串中。比如: String.format("%s来自%s,在%s上学", "张三", "杭州", "杭州电子科技大学")会输出"张三来自杭州,在杭州电子科技大学上学"。 String.format("error: code=%d,message=%s,url=%s", 500, "服务器内部错误", "localhost:8080/index.html")会输出"error: code=500,message=服务器内部错误,url=localhost:8080/index.html"。 String.format("%c字母的后面是%c", 'a', 'b')会输出"a字母的后面是b"。 String.format("%b是错误的,%b是正确的", false, true)会输出"false是错误的,true是正确的"。 String.format("π约等于:%f", 3.1415)会输出"π约等于:3.141500"。 String.format("十六进制π约等于:%a", 3.1415)会输出"十六进制π约等于:0x1.921cac083126fp1"。 String.format("科学计数法π约等于:%e", 3.1415)会输出"科学计数法π约等于:3.141500e00"。 String.format("Hive数据库中like的用法为:%s like concat('%%','%s','%%')", "name", "张三")会输出"Hive数据库中like的用法为:name like concat('%','张三','%')"。 String.format("换行%n")会输出换行符。 使用String.format可以使字符串的拼接更加灵活和易读。可以根据实际需求动态地插入不同的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值