C#11新特性使用案例详解

目录
  • 前言
  • 新特性之原始字符串
  • 使用案例
  • 原始字符串使用需要注意的地方
    • 什么情况下需要超过三个双引号开头
    • 尾引号和尾引号前面的换行符不包括在最终内容中
    • 结尾的三个引号不另起一行行不行
    • 和内插字符一起使用
  • 总结

前言

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

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

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

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

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

现在我们不需要这样做了。

新特性之原始字符串

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

详细内容参考这里

使用案例

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

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

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

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

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

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

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

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

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

输出

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

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

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

将结尾字符放到内容后面,编译器会提示你将其放到自己的行上

这个可以理解为,在这种情况下可能会引起歧义,编译器不确定你的原始字符串是以下三种的哪一种。

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

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

和内插字符一起使用

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

如果你想输出下文

{张三}

会遇到这个问题的提示

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

如果你想输出的内容是

{{{{张三

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

总结

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

以上就是C#11新特性使用案例详解内容,更多关于C#11新特性的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#语言主要特性总结

    1.C#是一种从C++和Java继承而来的,简单的,现代的,面向对象的语言. 2.它的目标是综合Visual Basic高产和C++底层高效的特性. 3.它是Microsoft Visual Studio7.0 的一部分. 4.Visual studio支持Vb,VC++,C++,Vbscript,Jscript.所有这些语言提供对Microsft .NET平台的访问. 5..NET包括一个Common Execution引擎和一个丰富的类库. 6.Microsofts JVM eqiv就是Co

  • C# 9 新特性——record的相关总结

    Intro C# 9 中引入了 record,record 是一个特殊类,用它来实现 model 在有些情况下会非常的好用 Sample record RecordPerson { public string Name { get; init; } public int Age { get; init; } } record RecordPerson2(string Name, int Age); public static void MainTest() { var p1 = new Reco

  • C#7.0中新特性汇总

    以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio "15" Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉我们你的想法! C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善.或许最大的特性就是元祖和模式匹配,元祖可以很容易地拥有多个返回结果,而模型匹配可以根据数据的"形"的不同来简化代码.我们希望,将它们结合起来,从而使你的代码更加简洁高效,也可以使你更加

  • 深入浅析C# 11 对 ref 和 struct 的改进

    目录 前言 背景 ref 字段 生命周期 scoped unscoped ref struct 约束 反射 实际用例 栈上定长列表 栈上链表 未来计划 高级生命周期 总结 前言 C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性,这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进. 但是这部分的改进涉及的内容较多,不一定能在 .NET 7(C# 11)做完,因此部分内容推迟到 C# 12 也是有可能的.当然,还是很有希望能在 C# 11 的时间点就看到

  • C#6.0中你可能不知道的新特性总结

    为什么写? 今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,整体看下来是一脸懵逼的. 下班回到家里,打开这个视频,把视频中介绍的新特性用文档的形式记录下来,加深自己的印象,此处把我整理的文档分享出来,希望对大家能有所帮助! C#6.0已经发布快三年了,可能我们没有有太去关心新版本所加入的特性,有人说,发布新版本,无非就是添加一些"语法糖"罢了,不管是糖不是糖,既然加入了新功能,那么自然有新功能的好处,我们

  • C#11新特性使用案例详解

    目录 前言 新特性之原始字符串 使用案例 原始字符串使用需要注意的地方 什么情况下需要超过三个双引号开头 尾引号和尾引号前面的换行符不包括在最终内容中 结尾的三个引号不另起一行行不行 和内插字符一起使用 总结 前言 在日常开发中我们经常会将JSON.XML.HTML.SQL.Regex等字符串拷贝粘贴到我们的代码中,而这些字符串往往包含很多的引号",我们就必须将所有引号逐个添加转义符\进行转义.这个转义十分麻烦,且容易出错,而当我们们需要替换这些字符串时,重新粘贴进来的文本仍需要再次进行转义,简

  • Java8新特性 StreamAPI实例详解

    目录 Stream结果收集 结果收集到集合中 结果收集到数组中 对流中的数据做聚合计算 对流中数据做分组操作 对流中的数据做分区操作 对流中的数据做拼接 并行的Stream流 串行的Stream流 并行流 获取并行流 并行流操作 并行流和串行流对比 线程安全问题 Stream结果收集 面试官:说说你常用的StreamAPI. 结果收集到集合中 public static void main(String[] args){ // Stream<String> stream = Stream.of

  • SpringBoot2.3新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") public String demo() throws InterruptedException { // 模拟业务耗时处理流程 Thread.sleep(20 * 1000L); return "hello"; } } 当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (ki

  • JDK19新特性使用实例详解

    目录 前提 新特性列表 新特性使用详解 Record模式 Linux/RISC-V移植 外部函数和内存API 虚拟线程 向量API switch匹配模式 结构化并发 前提 JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用. 新特性列表 新特性列表如下: JPE-405:Record模式(预览功能) JPE-422:JDK移植到Linux/RISC-V JPE-424:外部函数和内存API(预览功能) JPE-425:虚拟线程,也就是协程(预览功能) JPE-4

  • JDK13的新特性之AppCDS详解

    简介 AppCDS的全称是Application Class-Data Sharing.主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度. 通常来说,如果要执行class字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来. 如果JVM启动的时候需要加载成百上千个class,那么需要的就不是一个小数目了. 对于打包好的jar包来说,只要jar的内容不变,那么jar包中的类的数据始终是相同的

  • JDK12的新特性之CompactNumberFormat详解

    简介 JDK12引入了新的格式化数字的类叫做CompactNumberFormat.主要方便我们对很长的数字进行简写.比如1000可以简写为1K或者1 thousand. 本文将会讲解CompactNumberFormat的基本构成和使用方法,最后在实际的例子中结束文章的讲解. 更多内容请访问www.flydean.com CompactNumberFormat详解 CompactNumberFormat做为格式化数字的一部分是NumberFormat的子类.作用就是将数字进行格式化.要想构建一

  • Vue高版本中一些新特性的使用详解

    一.深度作用选择器( >>> ) 严格来说,这个应该是vue-loader的功能."vue-loader": "^12.2.0" 在项目开发中,如果业务比较复杂,特别像中台或B端功能页面都不可避免的会用到第三方组件库,产品有时会想对这些组件进行一些UI方面的定制.如果这些组件采用的是有作用域的CSS,父组件想要定制第三方组件的样式就比较麻烦了. 深度作用选择器( >>> 操作符)可以助你一臂之力. <template>

  • SpringBoot2新特性 自定义端点详解

    SpringBoot2新特性 自定义端点 package com.yan.otlan.springboot; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.a

  • react-router v6新特性总结示例详解

    目录 支持嵌套路由 Outlet 嵌套路由可配置化 useNavigate代替useHistory 由于之前的项目一直使用的是V5版本,最新新建项目的时候,默认使用的是V6版本,根据官方的介绍,V6版本的新特性如下. 新特性 <Switch>重命名为<Routes>: <Route>的新特性变更: 嵌套路由变得更简单: 新钩子useRoutes代替react-router-config: 用useNavigate代替useHistory: Link不再支持compone

  • Java8新特性之Base64详解_动力节点Java学院整理

    BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且很容易破解,他核心作用应该是传输数据的正确性,有些网关或系统只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据. JDK里面实现Base64的API 在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面

随机推荐