最近.NET7.0和C#11相继发布,笔者也是第一时间就用上了C#11,其中C#11的有一个更新能解决困扰我多年的问题,也就是文章的标题原始字符串 。
在使用C#11的原始字符串时 , 发现的一些有意思的东西,超出了我原本对它的期待,话不多说 , 我们一起来看看 。
多年的困扰我不知道大家有没有写过这样的代码,在单元测试里面我需要创建一个JSON字符串,比如像下面这样的:
{ "FareRules": ["1", "2"], "CabinLevels": ["2", "3"], "AirlineSuppliers": [{"AirlineCode": "MF","SupplierIds": ["123456", "345632", "898495"] }]}
然后变成C#代码我们就需要这样,为所有的"
添加一个斜杠,作为转义字符:
文章插图
【C#11之原始字符串】如果这样子看的不直观,我们想要多行表示,那需要这样,把一个
"
, 变为两个""
,然后才能输出:文章插图
不过这些有IDE在,设置一下可以自动做转换,不过像没有代码层级还好 , 像下面这种情况简直就是要弄死强迫症,直接就输出了一些无用的空格 。
文章插图
在JSON这个场景没啥大问题,但是如果你写的是SQL,那每次和数据库服务器交互时,都会把这些无用的空格传递过去 。所以不得不写成下面这样突兀的代码 , 把缩进全都给删除:
文章插图
原始字符串有了原始字符串以后,一切都美好了起来,实现第一个需求 , 我们只需要首位添加
"""
即可:文章插图
多行文本也不在话下,而且它以
"""
开始的那一列为准,不会输出多余的空格:文章插图
注意开头的
"""
和结尾的"""
必须是单独占用一行 , 否则就会报错:文章插图
另外,也贴心的给我们做了字符串校验,如果某一行没有和开头的
"""
在同一列,那么会给出异常提示:文章插图
那么有小伙伴就要问了 , 现在是字符串里面包含一个
"
符号可以解决,那假设我有一个地方包含两个"
呢?这也很简单,只需要往前面再加"
就可以了 。如果要输出大于两个双引号,那么在原始字符串定义上加一个双引号即可,这是非常聪明的做法:文章插图
另外原始字符串也支持字符串插值 , 比如下面的JSON,如果直接使用
$
,那么会报错,因为字符串内插的格式就是$"ABC {变量} ABC"
,内插的字符需要使用括号包起来,但是JSON已经把括号使用了:文章插图
聪明的你肯定想到了,是不是多加一个
$
, 变成两个$$
就行了呢?确实是这样的,在原来的基础上加多少$
符号就决定了里面能有多少个相邻的{
:文章插图
同样 , 我们想多输出几个
{
也是一样的道理,我就想把这一块JSON用{{
括起来,还想用字符串内插就像下面这样做就可以了:文章插图
总结C#终于解决了这个多年压死强迫症的困扰 , 以前用JS的时候还会羡慕有"```"标识符,可以多行文本直接用,而且还不用写转义,而引以为豪的语法糖居然没有这个功能 。
现在咱们也用上了 , 不过还有很多Rust、TypeScript的语法特性值得C#学习,C#还得加油呀?。。?
推荐阅读
- 手记系列之三 ----- 关于使用Nginx的一些使用方法和经验
- 不思议迷宫玛尔斯之殿有哪些彩蛋
- 健康喂养之狗粮怎么喂,吃什么狗粮好(谷物狗粮和无谷物狗粮)
- 终篇 支持JDK19虚拟线程的web框架,之五:兴风作浪的ThreadLocal
- 不思议迷宫玛尔斯之殿怎么玩
- Java安全之Mojarra JSF反序列化
- elasticsearch聚合之bucket terms聚合
- 赛尔号破解破解幽契之门通关符文位置图示
- “黑绷带的力量” 首先,它有一个奇怪的名字,叫“黑绷带” 其次,在看产品介绍之初,它是一款晚霜。
- 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents