C#11新特性之原始字符串
创始人
2024-02-14 04:49:14

随着.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 越来越好。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...