zoukankan      html  css  js  c++  java
  • 为什么要用内插字符串代替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> 错误使用方式

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

    <2> 正确使用方式

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

    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}");
                }
            }
    

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

  • 相关阅读:
    Docker理解
    提高服务器并发量,有关系统配置的常规方法
    Linux EXT 文件系统 详解
    jvm入门
    2020-1-08.运维面试题总结
    hexo+gitee
    rsync
    haddop3.2.1完全分布式安装
    zabbix02
    zabbix监控工具问题集
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/12679226.html
Copyright © 2011-2022 走看看