为什么要用内插字符串代替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字符串格式化—String.format()的使用以及Printf的使用
Java字符串格式化-String.format()的使用以及Printf的使用 tring类的format()方法用于创建格式化的字符串以及连接多个字符串对象.记得C语言的printf()方法,两者 ...
- JAVA字符串格式化-String.format()的使用
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- java format 字符_JAVA字符串格式化-String.format()的使用
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- Java系列: JAVA字符串格式化-String.format()的使用(zz)
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- JAVA字符串格式化-String.format()使用
传统型格类型 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 熟悉C语言的同学应该记得C语言的sprintf()方法.两者有类似之处.format()方法有两种重载 ...
- java string format s_JAVA字符串格式化-String.format()的使用
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- JAVA 字符串格式化-String.format()的使用(转)
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- java字符串format_JAVA字符串格式化-String.format()的使用
package ziv.testlibrary; import java.util.Date; import java.util.Locale; /** * Created by ziv on 201 ...
- 学用 ASP.Net 之 字符串 (2): string.Format
一般应用与左右对齐: protected void Button1_Click(object sender, EventArgs e) {TextBox1.TextMode = TextBoxMode ...
最新文章
- 无人驾驶产业发展现状及影响
- 修改系统density适配
- 如何调用别人提供的API?
- ios模拟器装ipa包_在iOS开发的时候如何在模拟器中安装APP
- php适合响应式吗,响应式和自适应
- python最基本的两种循环结构_Python基础 — 分支和循环
- 【通知】有三AI固态硬盘最后一次补货,再增3套视频!
- 肝!Python 网络编程
- js 线段上某点的坐标_测绘测量中常用的坐标系
- 实战HTML:模仿百度地图制作项目首页
- python opengl3d模型_初试PyOpenGL一 (Python+OpenGL)
- 1#组合数学初步——排列与组合之加法原理、乘法原理
- 微信公众号开发(一)配置服务器
- linux的yum是什么意思,yum是什么?(linux命令)
- 中国计算机软件专业技术资格和水平考试各地咨询地址和报名时间
- 幼儿园计算机和网络安全情况,幼儿园网络安全自查报告
- 哪款蓝牙耳机性价比最高?无线蓝牙耳机性价比排行榜
- 一米OA任意文件读取漏洞
- 安全多方计算与证券业数据生态
- 智能名片是什么?智能名片哪三大优势?
热门文章
- 了解jQuery技巧来提高你的代码
- 如何在Domino中使用文本文件注册用户
- Bye Bye Embed-再见了Embed,符合web标准的媒体播放器代码
- 保存网络文章以供以后使用Instapaper阅读
- android wi-fi_如何在Android手机上查找3G或Wi-Fi速度
- 控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法
- java ReentrantLock 锁相关笔记
- mysqldump导出备份数据库报Table ‘performance_schema.session_variables‘ doesn‘t exist
- E-MapReduce上如何升级EMR-Core
- 【CodeForces 577C】Vasya and Petya’s Game