4

C#11之原始字符串 - InCerry

 1 year ago
source link: https://www.cnblogs.com/InCerry/p/cs-11-raw-string.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近.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#代码我们就需要这样,为所有的"添加一个斜杠,作为转义字符:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112154425221.png

如果这样子看的不直观,我们想要多行表示,那需要这样,把一个",变为两个"",然后才能输出:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112154733869.png

不过这些有IDE在,设置一下可以自动做转换,不过像没有代码层级还好,像下面这种情况简直就是要弄死强迫症,直接就输出了一些无用的空格。

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112155019567.png

在JSON这个场景没啥大问题,但是如果你写的是SQL,那每次和数据库服务器交互时,都会把这些无用的空格传递过去。所以不得不写成下面这样突兀的代码,把缩进全都给删除:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112155301846.png

原始字符串

有了原始字符串以后,一切都美好了起来,实现第一个需求,我们只需要首位添加"""即可:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112160422707.png

多行文本也不在话下,而且它以"""开始的那一列为准,不会输出多余的空格:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161459307.png

注意开头的"""和结尾的"""必须是单独占用一行,否则就会报错:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161741710.png

另外,也贴心的给我们做了字符串校验,如果某一行没有和开头的"""在同一列,那么会给出异常提示:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161950960.png

那么有小伙伴就要问了,现在是字符串里面包含一个"符号可以解决,那假设我有一个地方包含两个"呢?这也很简单,只需要往前面再加"就可以了。如果要输出大于两个双引号,那么在原始字符串定义上加一个双引号即可,这是非常聪明的做法:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112162546629.png

另外原始字符串也支持字符串插值,比如下面的JSON,如果直接使用$,那么会报错,因为字符串内插的格式就是$"ABC {变量} ABC",内插的字符需要使用括号包起来,但是JSON已经把括号使用了:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164030569.png

聪明的你肯定想到了,是不是多加一个$,变成两个$$就行了呢?确实是这样的,在原来的基础上加多少$符号就决定了里面能有多少个相邻的{

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164243960.png

同样,我们想多输出几个{也是一样的道理,我就想把这一块JSON用{{括起来,还想用字符串内插就像下面这样做就可以了:

image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164411251.png

C#终于解决了这个多年压死强迫症的困扰,以前用JS的时候还会羡慕有"```"标识符,可以多行文本直接用,而且还不用写转义,而引以为豪的语法糖居然没有这个功能。

现在咱们也用上了,不过还有很多Rust、TypeScript的语法特性值得C#学习,C#还得加油呀!!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK