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

2023-11-05 18:32

本文主要是介绍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

总结

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

这篇关于C# 11 的这个新特性,我愿称之最强!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351731

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };