李锋镝的博客

  • 首页
  • 时间轴
  • 留言
  • 插件
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
  • 知识库
  • 赞助
Destiny
自是人生长恨水长东
  1. 首页
  2. 转载
  3. 技术
  4. 正文

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

2022年4月22日 8562点热度 0人点赞 4条评论

前言

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

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

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

 

为复现该问题,在控制台或单元测试中,将该参数定义,并调用MyLogic方法,
C# 11 的这个新特性,我愿称之最强!

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

C# 11 的这个新特性,我愿称之最强!
现在我们不需要这样做了。

新特性之原始字符串

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

使用案例

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

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

又比如我需要粘贴一段html,如果没有这新特性,转义那么多引号,你可能会疯吧!!
C# 11 的这个新特性,我愿称之最强!

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

  • 以至少三个双引号 ( """...""") 开头和结尾,任何数量小于打开原始字符串文字的数量的双引号都被视为内容。
  • 尾引号和尾引号前面的换行符不包括在最终内容中。
  • 原始字符串文本通常在单个行上使用三个双引号来启动字符串,另一行的三个双引号结束字符串。
  • 可以和$(可有多个)内插字符串一起使用,前缀$的数量是指示嵌套代码表达式所需的花括号的数量。如果原始字符串文字以$$为前缀,则将单个大括号视为内容,并且需要两个大括号来指示嵌套代码。就像使用引号一样,您可以添加更多$以允许将更多大括号视为内容。

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

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

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

如下如,编译器自动以结尾""""前为界限显示出一条竖线,竖线左侧的空格不算作内容。
C# 11 的这个新特性,我愿称之最强!

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

将结尾字符放到内容后面,编译器会提示你将其放到自己的行上
C# 11 的这个新特性,我愿称之最强!
这个可以理解为,在这种情况下可能会引起歧义,编译器不确定你的原始字符串是以下三种的哪一种。

你"""好"""啊

或(前面有空格)

          你"""好"""啊

或(换行 前面有空格)


          你"""好"""啊

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

C# 11 的这个新特性,我愿称之最强!
如果是全在一行也行,因为不会产生歧义。

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

和内插字符一起使用

这个比较难理解点,$符号的数量也是不固定的,根据你需要连续将多少个花括号作为原始字符
你想要输出的内容没有括号时,属于常规用法,没什么好说的。
C# 11 的这个新特性,我愿称之最强!
如果你想输出下文

    {张三} 

会遇到这个问题的提示
C# 11 的这个新特性,我愿称之最强!
简单理解就是,你需要将一个大括号视作内容,就需要两个$作为前缀,你需要将n个括号是做内容,就需要n 1个$做为前缀,同样内插字符串也需要消耗跟$同样数量的大括号。
因为你要将一个大括号视为内容,所以需要1 1 = 2个$,同样,内插变量也需要跟$数量一致的括号包裹,所以修改后的代码如下。
C# 11 的这个新特性,我愿称之最强!

如果你想输出的内容是

    {{{{张三

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

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

总结

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

 

原文链接:https://www.cnblogs.com/springhgui/p/16172263.html

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/archives/transport/3851

相关文章

  • ThreadLocal如何解决内存泄漏问题
  • 高并发下的数据一致性保障
  • SpringBoot定时任务 - 经典定时任务设计:时间轮(Timing Wheel)案例和原理
  • MybatisCodeHelperPro激活
  • @Resource 和 @Autowired 的区别
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C#
最后更新:2022年4月22日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • 林三

    镝兄,你这满屏的代码我是看不懂了~ 哈哈

    2022年5月10日
    回复
    • 李锋镝

      @林三 :douyin.19: 老哥你太谦虚了

      2022年5月11日
      回复
  • 庞先生

    您好博主,由于loli域名已经出售,「城南旧事」博客网站链接申请更换链接为 http://www.pho.ink
    十分感谢长久以来的支持哦~

    2022年5月1日
    回复
    • 李锋镝

      @庞先生 已更新~

      2022年5月1日
      回复
  • 1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
    回复 李锋镝 取消回复

    但使龙城飞将在,不教胡马度阴山。

    最新 热点 随机
    最新 热点 随机
    ReentrantLock深度解析 RedisTemplate和Redisson的区别 SpringBoot常用注解 CompletableFuture使用详解 金融级JVM深度调优实战的经验和技巧 SpringBoot 实现接口防刷的 5 种实现方案
    玩博客的人是不是越来越少了?2024年11月1号 农历十月初一准备入手个亚太的ECS,友友们有什么建议吗?别再背线程池的七大参数了,现在面试官都这么问@Valid 和 @Validated 的区别SpringBoot 实现接口防刷的 5 种实现方案
    Eclipse快捷键 TestNG基本注解 Xshell 家庭、学校免费版下载 wordpress增加说说功能 Java 为什么有这么多 “O”? 准备入手个亚太的ECS,友友们有什么建议吗?
    标签聚合
    JAVA 多线程 IDEA MySQL SpringBoot JVM 教程 日常 设计模式 文学 docker Redis 架构 SQL K8s 数据库 面试 分布式 Spring ElasticSearch
    友情链接
    • i架构
    • LyShark - 孤风洗剑
    • 临窗旋墨
    • 博友圈
    • 博客录
    • 博客星球
    • 哥斯拉
    • 志文工作室
    • 搬砖日记
    • 旋律的博客
    • 旧时繁华
    • 林羽凡
    • 知向前端
    • 集博栈
    • 韩小韩博客

    COPYRIGHT © 2025 lifengdi.com. ALL RIGHTS RESERVED.

    Theme Kratos Made By Dylan

    津ICP备2024022503号-3