C# 11 的这个新特性,我愿称之最强!

前言

在日常开发中我们经常会将JSON、XML、HTML、SQL、Regex等字符串拷贝粘贴到我们的代码中,而这些字符串往往包含很多的引号",我们就必须将所有引号逐个添加转义符\进行转义。这个转义十分麻烦,且容易出错,而当我们们需要替换这些字符串时,重新粘贴进来的文本仍需要再次进行转义,简直让人崩溃。

在我的工作中经常会遇到这么一个场景,对于某核心业务的方法,业务执行前一般会进行日志输出参数对象(Json格式),这样可在业务出现故障时追溯到当时的参数值,有利于事后补偿或复现bug等。
假设故障发生了,我从日志中获取了这个参数值的内容如下

{"kpzdbs": "YJ2","jqbh": "499098528334","fplxdm": "026","fpqqlsh": "ZJBX965525","kplx": 0,"tspz": "00"
}

为复现该问题,在控制台或单元测试中,将该参数定义,并调用MyLogic方法,
877fbb2780995983fbf619d793d76095.png

可以看到报错的字符串是我直接从日志中拷贝的json粘贴进去的,需要对所有的"进行转义,这是很蛋疼的一个问题,有时候可能需要将很多日志中的对象粘贴进来测试,每次粘贴完还要进行插入转义符号

7bd210ad6bd13650caa61ddf8c682464.png
现在我们不需要这样做了。

新特性之原始字符串

原始字符串文本 是字符串文本的新格式。原始字符串文本可以包含任意文本,包括空格、新行、嵌入引号和其他特殊字符,而无需转义序列。原始字符串文本以至少三个双引号开头, (""") 个字符。它以相同数量的双引号字符结尾。通常,原始字符串文本在单个行上使用三个双引号来启动字符串,另一行的三个双引号结束字符串。尾引号和尾引号前面的换行符不包括在最终内容中。详细内容参考这里

使用案例

我使用这一新特性修改上面场景中的代码如下,可以看到,json字符串不做任何转义直接粘贴进来即可。

5445a9acbd0cd8ab6ac7f4a36b7040c4.png

又比如我需要粘贴一段html,如果没有这新特性,转义那么多引号,你可能会疯吧!!
a6971bdb85bf1f9612907aa109c6d444.png

原始字符串使用需要注意的地方

  • 以至少三个双引号 ( """...""") 开头和结尾,任何数量小于打开原始字符串文字的数量的双引号都被视为内容。

  • 尾引号和尾引号前面的换行符不包括在最终内容中。

  • 原始字符串文本通常在单个行上使用三个双引号来启动字符串,另一行的三个双引号结束字符串。

  • 可以和$(可有多个)内插字符串一起使用,前缀$的数量是指示嵌套代码表达式所需的花括号的数量。如果原始字符串文字以$$为前缀,则将单个大括号视为内容,并且需要两个大括号来指示嵌套代码。就像使用引号一样,您可以添加更多$以允许将更多大括号视为内容。

什么情况下需要超过三个双引号开头

当字符串的内容中包含至少三个"一起出现,你的连续出现"的个数加1(最少三个),就是原始字符串要开头和结尾使用"的个数,所以说不是固定三个"
注意:图中字符串前面的|并不是输入的字符,是编译器的对齐提示。
83270a058a1710d204c81c8822a8ef1c.png
输出
e8d7451b0e0039bff6ed9666774f1c31.png

尾引号和尾引号前面的换行符不包括在最终内容中

如下如,编译器自动以结尾""""前为界限显示出一条竖线,竖线左侧的空格不算作内容。
a616e9cb9a474481d49f45e450a609fd.png

结尾的三个引号不另起一行行不行

将结尾字符放到内容后面,编译器会提示你将其放到自己的行上
da706ce89bd3442ad8325104d8d701f9.png
这个可以理解为,在这种情况下可能会引起歧义,编译器不确定你的原始字符串是以下三种的哪一种。

你"""好"""啊

或(前面有空格)

你"""好"""啊

或(换行+前面有空格)

你"""好"""啊

如果下面这样,则不会歧义,以箭头指向的竖线为界,左侧空格都不算做内容,右侧空格均算作内容

6d7a6b9ca6a60112a3bebe4e93137916.png
如果是全在一行也行,因为不会产生歧义。

20a93c1ca94126813b676488b207a423.png

和内插字符一起使用

这个比较难理解点,$符号的数量也是不固定的,根据你需要连续将多少个花括号作为原始字符
你想要输出的内容没有括号时,属于常规用法,没什么好说的。
a60d24864833abb4b8ab1fa0c5514e1a.png
如果你想输出下文

{张三}

会遇到这个问题的提示
5aae05affe3f88268441674551d5ccc0.png
简单理解就是,你需要将一个大括号视作内容,就需要两个$作为前缀,你需要将n个括号是做内容,就需要n + 1$做为前缀,同样内插字符串也需要消耗跟$同样数量的大括号。
因为你要将一个大括号视为内容,所以需要1 + 1 = 2$,同样,内插变量也需要跟$数量一致的括号包裹,所以修改后的代码如下。
260b89422046a87b8891f6f709389790.png

如果你想输出的内容是

{{{{张三

需要将四个括号视为内容,n = 4$数量为 4 + 1 = 5,内插变量也需要5和括号包裹。

34dddea677411379b2df637fbd57ab09.png

总结

当我们将带有引号的文本粘贴至编译器中需要进行大量的转义操作,原始字符串特性能很好的解决这个问题,让我们可以愉快进行粘贴这些字符串,但当与内插字符串使用时,尤其是多个大括号场景还是比较难以理解的,好在编译器会提示怎么做,且那种场景都属于极其不常见。

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

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

相关文章

php中有两个美元符号$$的变量——可变变量

(*ˉ﹃ˉ) 好凉的天气&#xff01;~~~ 直接上代码&#xff1a; <?php $a hello; $$a world; echo "$a ${$a}"; 以上代码的第二句&#xff0c;我们是用两个美元符号的变量&#xff0c;那么在这里这个变量是我们可变变量。我以下从第一句开始详细解释&#x…

剑指offer之反向打印链表值

1 问题 反向打印链表值 2 思考 1&#xff09; 我们利用栈的思想&#xff0c;新进后出&#xff0c;把链表的每个元素分别入栈之后再打印栈 2&#xff09;既然上面用到了栈&#xff0c;我们应该就会想到用到递归来实现 3 代码实现 #include <iostream> #include <st…

php调用数据库中的图片地址显示不出来,图片显示不出来,但是数据库里有显示...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼index.phpinclude con.php;?>#container{width: 17%;margin: auto auto;}.news_list {list-style: none;}.loadmore {color: #ffffff;border-radius: 5px;width: 60%;height: 50px;font-size: 15px;background: rgba(148, 175,…

互联网打响云上争夺战:从计算到生态

阿里云&#xff1a;用人工智能治理城市 国内互联网企业的战场今年已从“地面”上升到“云端”&#xff0c;BAT先后对各自的云计算进行了品牌升级&#xff0c;网易等企业也开始积极参战&#xff0c;利用在技术积累及原有领域等方面的优势&#xff0c;通过与相关方合作&#xff0…

gtk+学习笔记(五)

今天继续做的是昨天那个界面对的优化&#xff0c;直接贴下代码&#xff0c; 1 void click_radio(GtkWidget *widget,gpointer *data)2 {3  GtkWidget *dialog;4  GtkWidget *box; 5  GtkWidget *pbox;6  GtkWidget *bbox; 7  GtkWidget *password_label,*passw…

python如何开启多线程_Python如何创建多线程

Python提供了_thread和threading两个模块来支持多线程&#xff0c;但_thread提供低级别的、原始的县城支持&#xff0c;以及一个简单的锁&#xff0c;通常情况下我们使用后者&#xff0c;来进行多线程编程创建多线程使用threading模块创建线程有两种方式&#xff0c;一种是调用…

C#委托、事件学习之(二)——简单按钮委托事件

一、打开Form.cs文件,写入3个一般形式的EventArgs事件show1(),show2(),show3()。 using System; using System.Windows.Forms;namespace WindowsFormsApplication2 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void show1(object se…

php中的匿名函数简单使用

直接上代码了&#xff1a; <?php $test1 function($value) {echo $value; };$test1(HelloWorld); ?> 不懂你们有没有一种感觉&#xff0c;看见了js&#xff1f;近视的我&#xff0c;看到了function 就以为js… 好了&#xff0c;你看看最开始&#xff0c;是不是一个…

css3 设置背景图片大小(缩略图形式缩小)

废话当然不说了。直接上代码 <style>#mycon{background:url(Tpl/1.jpg);background-size:400px 400px;background-repeat:no-repeat;border-radius: 4px;border: 1px solid #ccc;width: 400px;height: 400px;}</style> <div id"mycon">原来背景图大…

C# WPF UI框架MahApps切换主题

概述本指南将向您介绍MahApps.Metro如何切换主题&#xff0c;所有的MahApps.Metro的主题都包含在单独的资源字典中。如何使用主题您可以在以下可用配色方案中进行选择&#xff1a;"Red", "Green", "Blue", "Purple", "Orange&quo…

剑指offer之打印链表的倒数第N个节点的值

1 问题 打印链表的倒数第N个节点的值&#xff0c;&#xff08;要求能只能便利链表一次&#xff09; 比如链表如下&#xff0c;打印倒数第三个值就是4 1-> 2-> 3-> 4-> 5-> 6 2 思路 既然只要只能遍历一次&#xff0c;我们可以这样思考&#xff0c;比如我们要…

网盘搜索插件php源码,百度云网盘搜索引擎 PHP版 v1.0

百度云网盘搜索引擎是一个以PHPMySQL进行开发的网盘搜索引擎源码。百度云网盘搜索引擎运行运行环境 开始之前你需要安装* PHP 5.3.7 * MySQL* Python 2.7 ~* [xunsearch](//xunsearch.com/) 搜索引擎项目的目录结构___大致是这样的--- indexer/ #索引--- spider/ #爬虫--- sql/…

C#委托、事件学习之(三)——热水器烧水案例

using System;namespace DelegateExample {public class Heater{private int temperature;public string type = "RealFire 001"; // 添加型号作为演示public string area = "China Xian"; // 添加产地作为演示//声明委托public delegate void BoiledEvent…

【hive】——metastore的三种模式

Hive中metastore&#xff08;元数据存储&#xff09;的三种方式&#xff1a; 内嵌Derby方式Local方式Remote方式[一]、内嵌Derby方式 这个是Hive默认的启动模式&#xff0c;一般用于单元测试&#xff0c;这种存储方式有一个缺点&#xff1a;在同一时间只能有一个进程连接使用数…

IDC:第一季度全球服务器市场收入下滑4.6% 市场为重大升级做准备

根据IDC全球服务器市场季度追踪报告&#xff0c;2017年第一季度全球服务器市场的厂商收入同比下滑4.6%。整个服务器市场的增长继续放缓&#xff0c;大多数超大规模服务提供商都在等待今年第二季度部署英特尔新的Skylake处理器。高端服务器销售继续拖累整体市场表现&#xff0c;…

DataGridView很详细的用法

DataGridiew用法总结一、DataGridView 取得或者修改当前单元格的内容&#xff1a; 当前单元格指的是 DataGridView 焦点所在的单元格&#xff0c;它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候&#xff0c;返回Nothing(C#是null) // 取得当…

python如何创建excel文件_Python xlrd/xlwt 创建excel文件及常用操作

一、创建excel代码备注&#xff1a;封装好了(可直接调用)"""-*- coding:utf-8 -*-Time :2020/8/20 21:02Author :JarvisFile :jar_excel_util.pyVersion&#xff1a;1.0"""from typing import Listimport xlwtclass JarExcelUtil:def __init__(s…

最通俗易懂的依赖注入之服务注册与注入

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这篇文章是 ASP.NET 6 依赖注入系列文章的第 4 篇&#xff0c;点击上方蓝字可以阅读整个系列。在上一篇文章中&#xff0c;我们讨论了依赖注入的服务容器与服务作用域。接下来&#xff0c;在这篇文章中&#xff0c;我们继…

linux之可视化查看磁盘大小并且删除大文件

1 问题 可视化查看磁盘大小并且删除大文件&#xff0c;之前我一直没有找到好的办法&#xff0c;原谅我的无知。 2 操作 我们直接搜索Disk Usage Analyzer 然后一个一个目的的点击查看&#xff0c;如下图 我们就可以清晰的看到文件占用大小&#xff0c;我们就可以很好的删除了…

php Heredoc应用说明

Heredoc部分实现界面与代码的准分离 我们如下的例子可以了解 Heredoc&#xff1a; <?php $name http://blog.csdn.net/a757291228; echo <<<HRERDOC <html> <head> <title>http://blog.csdn.net/a757291228</title> </head>…