C#11新特性之原始字符串

随着.NET 7与C#11的发布,微软发布了C# 11 中的原始字符串这个新特性。 这个新特性解决了祖传字符串中引号的问题。


微软官方的表述是:" Raw string literals",圈里都叫他”原始字符串”。从字面不难看出,它是适用于字符串的新特性,解决字符串中特殊字符的新语法。


原始字符串可以包含任意文本,包括空格、新行、嵌入的引号及其他特殊字符。


原始字符串至少以三个双引号"""字符开头,以相同数量的双引号字符结束。通常,原始字符串文字在一行使用三个双引号开始字符串,在另一行使用三个双引号结束字符串。


说了这么多,来看一个实际案例,假如有这么一个JSON字符串

{
	"id": 74,
	"coverImage": "/static/points/meituan.png",
	"name": "30天骑行卡",
	"price": "25",
	"point": 2500,
	"companyName": "公司",
	"description": "共享单车30天畅骑卡",
	"expired": "2022年12月31日 23:59:59",
	"attention": "所有解释权归公司所有"
}


过去

在C#11之前,我们把他变成C#代码要这样写:

var JsonStr = "{\"id\": 74,\"coverImage\": \"/static/points/meituan.png\",\"name\": \"30天骑行卡\",\"price\": \"25\",\"point\": 2500,\"companyName\": \"公司\",\"description\": \"共享单车30天畅骑卡\",\"expired\": \"2022年12月31日 23:59:59\",\"attention\": \"所有解释权归公司所有\"}";
Console.WriteLine(JsonStr);


写成一行的话,代码的可读性太差了。为了让代码更有可读性,可以用原义标识符@定义字符串,这时大部分字符不需要转义,但是双引号要转义成""

var JsonStr = @"{
	""id"": 74,
	""coverImage"": ""/static/points/meituan.png"",
	""name"": ""30天骑行卡"",
	""price"": ""25"",
	""point"": 2500,
	""companyName"": ""公司"",
	""description"": ""共享单车30天畅骑卡"",
	""expired"": ""2022年12月31日 23:59:59"",
	""attention "": ""所有解释权归所有""
}";
Console.WriteLine(JsonStr);


这样使用起来没什么问题,但如果查看输出结果是这样的

1.png


多输出了很多无用空格(缩进),这是要活活逼死强迫症的感觉。

如果需要在字符串中使用差值表达式,可以用$将字符串文本标识为差值字符串,然后就变成了这样:

int point = 2500;
var JsonStr = @$"
{{
	""id"": 74,
	""coverImage"": ""/static/points/meituan.png"",
	""name"": ""30天骑行卡"",
	""price"": ""25"",
	""point"": {point},
	""companyName"": ""公司"",
	""description"": ""共享单车30天畅骑卡"",
	""expired"": ""2022年12月31日 23:59:59"",
	""attention "": ""所有解释权归公司所有""
}}";
Console.WriteLine(JsonStr);


需要注意的是:由于{}是差值表达式的一部分,所以表示为字符的{}需要转义成使用两个大括号{{}}

现在

有了原始字符串,一切都变的美好了起来。原始字符串文本从 C# 11 开始可用。原始字符串文本可以包含任意文本,而无需转义。
划重点:原始字符串文本用至少三个双引号括起来。也就是"""

我们来看第一个需求,一行的写法:

var JsonStr = """{"id":74,"coverImage":"/static/points/meituan.png","name":"30天骑行卡","price":"25","point":2500,"companyName":"公司","description":"共享单车30天畅骑卡","expired":"2022年12月31日 23:59:59","attention":"所有解释权归公司所有"}""";
Console.WriteLine(JsonStr);


非常的Nice,多行的写法:

var JsonStr = 
	"""
	{
		"id": 74,
		"coverImage": "/static/points/meituan.png",
		"name": "30天骑行卡",
		"price": "25",
		"point": 2500,
		"companyName": "公司",
		"description": "共享单车30天畅骑卡",
		"expired": "2022年12月31日 23:59:59",
		"attention": "所有解释权归公司所有"
	}
	""";
Console.WriteLine(JsonStr);


需要注意的问题

一行的写法,只需要在JSON字符串头尾加上"""就可以了,多行的时候,开头的"""和结尾的"""必须是单独占用一行,否则就会报错:

1.png


这里的独占一行,意思是开头,内容,结尾必须分开。
可以是这样的:

var JsonStr ="""
	...
	"""


也可以是这样的

var JsonStr =
	"""
	...
	"""


还有一个错误是这样的

1.png


大概意思是缩进不对,也就是说某一行没有跟开头的"""在同一列,但我看了半天也没看出来到到底哪不对。这是个什么意思?有知道的大神评论区指导一下吧。

如果JSON字符串中,一些值需要 "" 来引起来的话,改怎么办呢?很简单,只需要在需要加引号的值上,再加引号就可以了

Console.WriteLine(""" ""30天骑行卡"" """);


当需要使用差值字符串的时候,"""前面加$$就可以了。在JSON内部,差值表达式也需要使用{{}}括起来。代码长这个样子:

int point = 2500;
var JsonStr = 
	$$"""
	{
		"id": 74,
		"coverImage": "/static/points/meituan.png",
		"name": "30天骑行卡",
		"price": "25",
		"point": {{point}},
		"companyName": "公司",
		"description": "共享单车30天畅骑卡",
		"expired": "2022年12月31日 23:59:59",
		"attention": "所有解释权归公司所有"
	}
	""";
Console.WriteLine(JsonStr);

总结

原始字符串是C# 11给我们提供的一个便捷的语法糖,可以让我们不在羡慕JS的"```"标识符了。.NET 7和C# 11的更多新功能,还需继续探索,也希望.NET 越来越好。