随着.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);
多输出了很多无用空格(缩进),这是要活活逼死强迫症的感觉。
如果需要在字符串中使用差值表达式,可以用$
将字符串文本标识为差值字符串,然后就变成了这样:
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字符串头尾加上"""
就可以了,多行的时候,开头的"""
和结尾的"""
必须是单独占用一行,否则就会报错:
这里的独占一行,意思是开头,内容,结尾必须分开。
可以是这样的:
var JsonStr ="""
...
"""
也可以是这样的
var JsonStr =
"""
...
"""
还有一个错误是这样的
大概意思是缩进不对,也就是说某一行没有跟开头的"""
在同一列,但我看了半天也没看出来到到底哪不对。这是个什么意思?有知道的大神评论区指导一下吧。
如果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 越来越好。