网站首页 > 开源技术 正文
推荐学习
知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用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}");复制代码
内插字符串法仅仅就是在字符串前面加上"#34;即可,给点时间大家仔细品味一下,是不是很好的解决了我之前提到的3个痛点。
1. 三目运算符在内插法的使用
很多时候在业务开发中,不能仅仅是填充一个变量,而最好还应该支持一些表达值,如使用最多的三目运算符
<1> 错误使用方式
如果你直接这么写,通过不了狠毒的编译器,比如下面这样。
<2> 正确使用方式
解决方法也能简单,在外围加上一个()即可。
2. 复杂逻辑的内插法使用
如果你有复杂的业务逻辑,建议单独另起一个方法。
class Program
{
static void Main(string[] args)
{
var num = 10;
var info = #34;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(#34;i={it},j={jt},k={kt}");
}
}
好了,本篇就说到这里,希望对你有帮助。
作者:一线码农上海
原文链接:https://juejin.im/post/5e9e781a6fb9a03c8966ed32
- 上一篇: 为什么要用内插字符串代替string.format
- 下一篇: .NET-每周精选(net定时任务)
猜你喜欢
- 2024-09-30 C# new(new)
- 2024-09-30 .NET-每周精选(net定时任务)
- 2024-09-30 为什么要用内插字符串代替string.format
- 2024-09-30 过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?
- 2024-09-30 推荐几个对Asp.Net开发者比较实用的工具 2
- 2024-09-30 [WPF]总结一些我在开发WPF时常用的工具
- 2024-09-30 C#核心-迭代器揭秘1(c语言 迭代器)
- 2024-09-30 C#核心-迭代器揭秘2(c#迭代法求e)
- 2024-09-30 C# 9 中又来一堆关键词 init,record,with
- 2024-09-30 代码安全之代码混淆(代码混淆器到底是不是病毒)
你 发表评论:
欢迎- 最近发表
-
- 使用Python实现图片文件的加密与解密:保障隐私安全的实用方案
- 吴恩达官宣开源,yyds!(吴恩达rnn)
- Python自动化办公实战:效率提升10倍的脚本开发指南
- Android让视图显示未读消息数量(未读消息图标怎么显示)
- docker容器安装与部署,常用命令、容器卷、dockerfile,详细教程
- pytorch的一个最简单的cpp扩展(pytorch cdist)
- 如何编译.Net 6 Runtime源码(编译framework)
- 微软Windows 11将改版BSOD、强制登录账号才能安装
- windows环境下配置sphinx输出html文档
- 超详细windows安装配置WSL2(ubuntu20.04)步骤
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)