知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用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个占位符,当年写这个的时候,会有三个痛点。
比如这里的 {0},{1},{2}.... 不能写成了 {0},{0},{2},造成结果的重复输出。
比如把最后的leafletentity.shopid 参数值给丢了,造成8个占位符,7个参数的现象,这样就会造成系统抛异常。
参数值个数多了,很难保证顺序没被搞错,比如这里的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个痛点。
很多时候在业务开发中,不能仅仅是填充一个变量,而最好还应该支持一些表达值,如使用最多的三目运算符
如果你直接这么写,通过不了狠毒的编译器,比如下面这样。
解决方法也能简单,在外围加上一个()即可。
如果你有复杂的业务逻辑,建议单独另起一个方法。
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}"); } }
好了,本篇就说到这里,希望对你有帮助。
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论