知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用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}");
           }
       }


©著作权归作者所有:来自51CTO博客作者mb5fd86a704dffe的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 非常简单的string驻留池,你对它真的了解吗
  2. 数据结构与算法专题——第四题 字符串相似度
  3. 第6章 0201-常用字符串函数介绍,学习心得、笔记(PHP常用字符串函数
  4. 0201-常用字符串函数
  5. 我的第21个代码
  6. PHP基础: 字符串函数
  7. 2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一
  8. 事件与常用函数
  9. 第3章 0127-常用运算与流程控制,学心得、笔记(表达式、三元运算与n

随机推荐

  1. 单选按钮和多选按钮的样式设置
  2. 标签滑块旋转木马不工作在引导4
  3. HTML meta charset应该是小写还是大写?
  4. 加载跨域的HTML页面AJAX
  5. HTML5,简单的注册页面
  6. HTML5中对于网络是否断开的检测.很有意思
  7. 解决主页在不同浏览窗口下浏览兼容——百
  8. EL中的fn函数,jstl的fn函数,fn函数,fn函
  9. Android里string.xml使用html标签的方法
  10. struts2和struts1.x的标签库