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

news2025/8/8 8:55:00

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elasticsearch 之 histogram 直方图聚合

1. 简介 直方图聚合是一种基于多桶值聚合,可从文档中提取的数值或数值范围值来进行聚合。它可以对参与聚合的值来动态的生成固定大小的桶。 2. bucket_key如何计算 假设我们有一个值是32,并且桶的大小是5,那么32四舍五入后变成30&#xff…

两种方式实现css取消页面鼠标双击选中文字或单击拖动选中文字的效果

问题描述 我们知道浏览器页面上的文字正常情况下我们是可以双击选中、或者单击鼠标横向拖动也能选中的,选中以后可以右击出现面板然后去复制什么的。但是有的时候,这种效果我们并不想要的,比如用户点快了的时候,所以我们需要禁用…

TensorFlow之文本分类算法-3

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 N-gram向量集 序列向量集 序列向量集主要是用于序列模型中对文本执行分词与向量化,与n-gram向量集类似,也使用特征选择与标准化的技术优化序列向量集的表示。 在一些文本样例中,…

GaussDB-物理、逻辑备份 使用方法和[GAUSS-53403]解决办法

文章目录1.逻辑备份-gs_dump2.逻辑备份恢复数据库3.物理备份(分布式集群验证)查看物理全量备份集:查看物理增量备份集:查看所有备份集(该命令无法确定备份是否有效)停止物理备份:使用物理备份集…

centos7安装mysql8.0.31

mysql 官网 https://www.mysql.com/ 找到对应的版本 然后下载 连接虚拟机 mysql 会和 mariadb这个有冲突,需要卸载掉 查看是否有mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs 这个是强制卸载命令 再查看一下 rpm -qa|grep mariadb 在根目录创建…

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一python代码实现(更新完毕)

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 思路及代码实现(持续更新完毕) 更新信息 2022-11-24 10:00 更新问题1和问题2 思路 2022-11-24 23:20 更新问题一代码 2022-11-25 11:00 更新问题二代码 相关链接 【2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一pytho…

高性能数据访问中间件 OBProxy(六):一文讲透数据路由

在《高性能数据访问中间件 OBProxy(五):一文讲透数据路由》中,我们讲到了数据路由影响因素包括功能因素、性能因素和高可用因素。本文主要介绍高可用因素相关的内容。 相比传统的 IOE 架构,OceanBase 利用更低的成本实…

【你不知道的javascript上】2. 第三章 全局作用域,函数作用域和块作用域,立即执行函数

预警:【你不知道的javascript】开头的文章,是用来总结书籍《你不知道的Javascript》中我不熟悉的知识,单纯的用来巩固学到的知识,和加深记忆。 可能有些地方我理解的不透彻,所以不能够保证内容的正确性,欢迎…

使用Mysqldump进行定时全备和增备脚本

使用mysqldump进行全备,增备是备份binlog日志 对应的一些变量按照实际环境进行修改即可,如果有更好的思路也可以进行评论交流。 配合计划任务即可完成定时备份的需求,脚本中备份文件存放目录提前创建或者在加个判断进行创建不过我觉得没啥必…

UNIAPP实战项目笔记44 订单页面顶部选项卡 有数据页面样式布局和无数据页面样式布局

UNIAPP实战项目笔记44 订单页面顶部选项卡 有数据页面样式布局和无数据页面样式布局 订单页面顶部选项卡 具体内容图片自己替换哈,随便找了个图片的做示例 具体位置见目录结构 通过 v-show 的false 和 true来切换有无数据页面布局 代码 my-order.vue 页面部分 my-…

[附源码]java毕业设计医院挂号管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

自动化测试定位不到元素怎么办?

1.动态id定位不到元素 分析原因:每次打开页面,ID都会变化。用ID去找元素,每次刷新页面ID都会发生变化。 解决方案:推荐使用xpath的相对路径方法或者cssSelector查找到该元素。 2.iframe原因定位不到元素 分析原因:…

studio3T import a SQL Database to Mongodb(从mysql中导入数据到mongodb)

具体参考studio3T官方文档:Import a SQL Database to MongoDB in 5 Steps | Studio 3T 1、打开SQL Migration-->选择SQL to MongoDB Migration 2、创建源数据库的连接(本文源数据库是mysql) 3、选择目标数据库 默认选择当前连接的数据库…

【观察】OceanBase社区版4.0:引领时代,更创造时代

今年8月10日,在2022 OceanBase年度发布会上,OceanBase 4.0首次亮相,在经过85天的快速升级迭代,且历经内外部客户的场景测试与真实业务场景的稳定性“打磨”之后,OceanBase 4.0将“简单易用”的应用感受留给了客户。而在…

JS中的setter、getter数据存取器

JS属性可分为两种类型 ① 数据属性    只是简单存储了一个值 ② 存取器属性    最大的特点是在设置、获取属性值的时候能够做一些其他的操作 设置存取器属性的两种方式 ① 直接在对象中设置 let obj {count: 5, // 普通的数据属性// index为存取器属性_index: 1, // _in…

Linux系统上搭建Java的运行环境,并且部署JavaWeb程序

Linux系统上搭建Java的运行环境,并且部署JavaWeb程序 1.JDK 基于yum【包管理器】来进行安装即可。 yum list列出应用商店上所有的软件包名字。 yum list | grep jdk验证安装成功!! 2.Tomcat 由于yum商店里的tomcat的版本过低&#xff0…

SpringBoot SpringBoot 原理篇 1 自动配置 1.6 bean 的加载方式【四】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.6 bean 的加载方式【四】1.6.1 Import1 自动配置 1.6 bean 的加…

正大数据周五新鲜报 做期货要关注哪块消息?

正规的外盘期货公司都是在香港证监会的监管下,持有合法合规金融牌照。这点好比国内证券和期货公司在中国证监会的监管下一个道理,完全正规合法。 ​ ​如果你是想做主账户往下开展业务: 一、进入香港证监会官网查询该期货公司的编号 二、…

Spring 中 Bean 的作用域和生命周期

目录 1. Bean 的作用域 1.1 Bean 的六大作用域 1.1.1 单例作用域 (singleton) 1.1.2 原型作用域 (prototype) 1.1.3 请求作用域 (request) 1.1.4 会话作用于 (session) 1.1.5 全局作用于 (application) 1.1.6 HTTP WebSocket 作用域 (websocket) 1.2 如何设置 Bean 的…

142.如何个性化推荐系统设计-2

142.1 离线训练 离线训练流程 如何线上实时反馈特征? 在线计算,与曝光日志一起上报,离线直接使用 如何解决曝光不足问题? 使用CTR的贝叶斯平滑(CTR 曝光次数 / 点击次数) 所有新闻自身CTR服从Beta分布: 某…