知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用string.format超5个以上占位符,那其中的痛苦我想你肯定是能够共鸣的。
一:痛苦经历
先上一段曾今写过的一段代码,大家来体会一下:
LogHelper
这里拥有多达8个占位符,当年写这个的时候,会有三个痛点。
1. 占位符不能写错了
比如这里的 {0},{1},{2}.... 不能写成了 {0},{0},{2},造成结果的重复输出。
![d0d9b5b25ea43c86cbf8e19f6b94ff47.png](https://i-blog.csdnimg.cn/blog_migrate/fbdeab9398d6a6fb5416bca82d7e1b7b.png)
2. 参数值个数不能多也不能少
比如把最后的leafletEntity.ShopID 参数值给丢了,造成8个占位符,7个参数的现象,这样就会造成系统抛异常。
![7bd32a873c0e65475ee0ffce5b09f7c9.png](https://i-blog.csdnimg.cn/blog_migrate/9b3a10f54ae47e9d27d036ce12265c95.jpeg)
3. 参数值顺序不能错
参数值个数多了,很难保证顺序没被搞错,比如这里的leafletEntity.FailCount和leafletEntity.RepeatCustomerNum,颠倒为leafletEntity.RepeatCustomerNum和leafletEntity.FailCount,你能一眼看出来吗???
![2f65d8d390ca72402676198031e7d7f1.png](https://i-blog.csdnimg.cn/blog_migrate/05d60d8c4befec8f7812b5bc16d3e408.png)
二:解决办法
string.format也是曾今模仿C语言留下来的历史遗留问题,如今C#6.0出来了这个内插字符串完美的解决了这三个问题,简直不要太兴奋,接下来把文章开头处改成内插版。
LogHelper
内插字符串法仅仅就是在字符串前面加上"$"即可,给点时间大家仔细品味一下,是不是很好的解决了我之前提到的3个痛点。
1. 三目运算符在内插法的使用
很多时候在业务开发中,不能仅仅是填充一个变量,而最好还应该支持一些表达值,如使用最多的三目运算符
<1> 错误使用方式
如果你直接这么写,通过不了狠毒的编译器,比如下面这样。
![f80bdebdc981bdb8c6e0b04671bca070.png](https://i-blog.csdnimg.cn/blog_migrate/cb6d9a570c2c35980553cb87bf729aaf.jpeg)
<2> 正确使用方式
解决方法也能简单,在外围加上一个()即可。
![4160c8e0ec1b1fe4f0093145346eb748.png](https://i-blog.csdnimg.cn/blog_migrate/adda9e22667616bf776a688d6adbc9a1.png)
2. 复杂逻辑的内插法使用
如果你有复杂的业务逻辑,建议单独另起一个方法。
class
如何你的业务逻辑相对比较简单,可以用内联委托的方式实现。
![90115e097657b4a97c91588df637ec56.png](https://i-blog.csdnimg.cn/blog_migrate/7e629bd8a48bd9d4342dfa406b0fb43f.jpeg)
三:探究原理
接下来探究一下,内插字符串这种语法糖在IL层面到底是个啥玩意,你可以通过ILSpy工具查看IL代码。
![b9b506693168699812daa39b9134b8e4.png](https://i-blog.csdnimg.cn/blog_migrate/dead8cd515a4b5d22f314b697aac0c4c.jpeg)
从上面的截图来看,其实所谓的“内插字符串”就是string.format,编译器的语法糖而已
注意点:
因为有一个box操作,所以你要当点心,如果Console.WriteLine多次执行会有一定的性能损失,建议提前做好box操作,例如下面这样。
static
好了,本篇就说到这里,希望对你有帮助。