为什么要用内插字符串代替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}");
            }
        }

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

(0)

相关推荐

  • VSCode Snippets 使用指南

    我们在写代码的过程中,常常会遇到一些固定的代码结构,形如输入一串console.log或者输入for的结构甚至是编写redux的reducers等等.反复写这些代码结构,不仅枯燥无聊,也会觉得效率不够 ...

  • Python基础学习笔记(一)变量与数据类型

    https://m.toutiao.com/is/J3fN6eK/ Python是一门易学的面向对象的程序设计语言,可以轻易地完成界面.文件.封装等高阶需求,可移植性好,有非常多功能强大的库与包,如N ...

  • C# 基础知识系列- 9 字符串的更多用法(一)

    0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...

  • C#字符串类String的使用(二)

    格式化字符串 //格式化字符串 //一个静态的Format方法,用于将字符串数据格式化成指定的格式 string newstr = String.Format("{0},{1}!!!&quo ...

  • 7 网页上显示字符串 render+{'string': string}+{{ string }}

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/7 网页上显示字符串 render+{'string': string}+{{ string }} 作者:融水公子 rsgz  Django开发流 ...

  • C#的字符串优化-String.Intern、IsInterned

    首先看一段程序: 这个没有什么特殊的地方,相信大家都知道运行结果: 第二个WriteLine使用==比较两个字符串,返回False是因为他们不一致.而最后一个WriteLine返回False,因为a. ...

  • C#中string.format用法详解

    String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...

  • Tcl字符串命令string

    string string option arg ?arg ...? 操作字符串,具体操作由option决定,option支持以下选项: compare string compare ?-nocase ...

  • String字符串操作

    String strStart = "<count>"; String strEnd = "</<count>"; //定位首尾标 ...

  • 《Java 底层原理》String字符串详解

    前言 Java 字符串底层是如何存储的,如何提高性能的,今天就来好好了解一下. 字符串的存储结构 Jvm 有专门的字符串常量池用于存放字符串,存放字符串的数据结构是HashTable. HashTab ...

  • C string字符串比较方法详解

    字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较. Basic_string 类模板既提供了  >.<.==.>=.<=.!= 等比较运算符,还提供了 c ...

  • Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF

    Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF