最近.NET7.0和C#11相继发布,笔者也是第一时间就用上了C#11,其中C#11的有一个更新能解决困扰我多年的问题,也就是文章的标题原始字符串。

在使用C#11的原始字符串时,发现的一些有意思的东西,超出了我原本对它的期待,话不多说,我们一起来看看。

多年的困扰

我不知道大家有没有写过这样的代码,在单元测试里面我需要创建一个JSON字符串,比如像下面这样的:

{
"FareRules": ["1", "2"],
"CabinLevels": ["2", "3"],
"AirlineSuppliers": [{
"AirlineCode": "MF",
"SupplierIds": ["123456", "345632", "898495"]
}]
}

然后变成C#代码我们就需要这样,为所有的"添加一个斜杠,作为转义字符:

如果这样子看的不直观,我们想要多行表示,那需要这样,把一个",变为两个"",然后才能输出:

不过这些有IDE在,设置一下可以自动做转换,不过像没有代码层级还好,像下面这种情况简直就是要弄死强迫症,直接就输出了一些无用的空格。

在JSON这个场景没啥大问题,但是如果你写的是SQL,那每次和数据库服务器交互时,都会把这些无用的空格传递过去。所以不得不写成下面这样突兀的代码,把缩进全都给删除:

原始字符串

有了原始字符串以后,一切都美好了起来,实现第一个需求,我们只需要首位添加"""即可:

多行文本也不在话下,而且它以"""开始的那一列为准,不会输出多余的空格:

注意开头的"""和结尾的"""必须是单独占用一行,否则就会报错:

另外,也贴心的给我们做了字符串校验,如果某一行没有和开头的"""在同一列,那么会给出异常提示:

那么有小伙伴就要问了,现在是字符串里面包含一个"符号可以解决,那假设我有一个地方包含两个"呢?这也很简单,只需要往前面再加"就可以了。如果要输出大于两个双引号,那么在原始字符串定义上加一个双引号即可,这是非常聪明的做法:

另外原始字符串也支持字符串插值,比如下面的JSON,如果直接使用$,那么会报错,因为字符串内插的格式就是$"ABC {变量} ABC",内插的字符需要使用括号包起来,但是JSON已经把括号使用了:

聪明的你肯定想到了,是不是多加一个$,变成两个$$就行了呢?确实是这样的,在原来的基础上加多少$符号就决定了里面能有多少个相邻的{

同样,我们想多输出几个{也是一样的道理,我就想把这一块JSON用{{括起来,还想用字符串内插就像下面这样做就可以了:

总结

C#终于解决了这个多年压死强迫症的困扰,以前用JS的时候还会羡慕有"```"标识符,可以多行文本直接用,而且还不用写转义,而引以为豪的语法糖居然没有这个功能。

现在咱们也用上了,不过还有很多Rust、TypeScript的语法特性值得C#学习,C#还得加油呀!!!

C#11之原始字符串的更多相关文章

  1. .Net 7 C#11 原始字符串

    .Net7 的到来的同时,也带来了 C# 11,而令我最期待的就是 C# 11 的 原始字符串了,当我知道这个的时候,简直比过年还要开心. 非原始字符串 首先我们看看现在写字符串的方式 var str ...

  2. .Net 7内容汇总(2)--原始字符串

    在C# 11里,添加了一个叫原始字符串的东西. 这个东西算是我相当喜欢以及期待的功能. 我们先来看看这玩意咋用. 首先,我们先来看看之前如果我们需要定义一个带引号的字符串我们需要怎么做. var a ...

  3. JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

    package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...

  4. devi into python 笔记(六)正则表达式 原始字符串

    字符串函数replace: #string.replace: #字符串的replace方法:替换子串,不改变原来的字符串 s = "broad road" #打印出来会发现不单单是 ...

  5. python原始字符串

    str1='let's go' File "<input>", line 1 str1='let's go' ^ SyntaxError: invalid syntax ...

  6. Python基础语法——(引号、字符串、长字符串、原始字符串、Unicode)

    一.单引号字符串和转义引号 当字符串中出现单引号'时,我们可以用双引号""将该字符串引起来:"Let's go!" 而当字符串中出现双引号时,我们可以用单引号' ...

  7. leecode刷题(11)-- 反转字符串

    leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...

  8. scala学习手记6 - 字符串与多行原始字符串

    scala中的字符串类就是java中的java.lang.String类.不过scala也为String提供了一个富封装类:scala.runtime.RichString. scala可以将java ...

  9. Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试

    ylbtech-Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试 1.返回顶部 1. Java 实例 - 字符串性能比较测试  Java 实例 以下实例演 ...

随机推荐

  1. 从零开始搭建react基础开发环境(基于webpack5)

    前言 最近利用闲暇时间把webpack系统的学习了下,搭建出一个react环境的脚手架,写篇文章总结一下,帮助正在学习webpack小伙伴们,如有写的不对的地方或还有可以优化的地方,望大佬们指出,及时 ...

  2. OpenJudge1.5.17

    20:球弹跳高度的计算 总时间限制: 1000ms 内存限制: 65536kB 描述 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下. 编程计算气球在第10次落地时,共经过 ...

  3. KingbaseES sys_blocking_pids 函数

    会话出现了锁等待,想要快速查询到堵塞的会话,可以使用 sys_blocking_pids 函数来实现这一目的. sys_blocking_pids:获取哪些会话阻塞了某个会话(输入参数). sys_b ...

  4. KingbaseES时间函数的比较

    KingbaseES提供了多种的时间函数,这些函数在使用过程中存在哪些不同? **同一事务** test=# begin test-# for i in 1.. 10 loop test-# rais ...

  5. KingbaseES R6 集群创建流复制只读副本库案例

    一.环境概述 [kingbase@node2 bin]$ ./ksql -U system test ksql (V8.0) Type "help" for help. test= ...

  6. 巧用KingbaseES中的动态DDL

    概述 :在DBA的日常工作中,经常遇到一些需要基于数据库当前状态的实用程序查询的实例.比如一个逻辑复制的目标表,主键ID列与生成数据的序列不同步,这将导致插入新行是,会有主键冲突.要纠正这个问题,需要 ...

  7. Python 第四次实验

    1.(程序设计)定义函数def GetRandomChar(),返回一个随机的数字或大写或小写字母,每个符号出现的机会相等.调用该函数8次,生成并输出一个8位的验证码.用户输入该验证码,如果验证码正确 ...

  8. 使用SSH连接Windows Server

    之前发过一篇在Windows Server上启用SSH服务器的文章.最近正好有这个需求,需要使用密钥免密登录服务器,试了一下,发现之前的方法不行了.需要再修正一些文件权限. 需要使用Repair-Au ...

  9. ProxySQL 匹配规则

    现实中很多场景要求更新数据能立马查到数据,而主从同步在这方面无解,所以从规则上修改,一些需要及时查询的语句在主上. # 用户登录 mysql -h192.168.0.103 -P16032 -urad ...

  10. Kubernetes 部署 Nacos 1.4 集群

    文章转载自:http://www.mydlq.club/article/104/ 系统环境: Nacos 版本:1.4.1 Mysql 版本:8.0.19 Kubernetes 版本:1.20.1 一 ...