小配角 發表於 2022-11-14 09:41:00

C#11之原始字符串

<p>最近.NET7.0和C#11相继发布,笔者也是第一时间就用上了C#11,其中C#11的有一个更新能解决困扰我多年的问题,也就是文章的标题原始字符串。</p>
<p>在使用C#11的原始字符串时,发现的一些有意思的东西,超出了我原本对它的期待,话不多说,我们一起来看看。</p>
<h2 id="多年的困扰">多年的困扰</h2>
<p>我不知道大家有没有写过这样的代码,在单元测试里面我需要创建一个JSON字符串,比如像下面这样的:</p>
<pre><code class="language-json">{
        "FareRules": ["1", "2"],
        "CabinLevels": ["2", "3"],
        "AirlineSuppliers": [{
                "AirlineCode": "MF",
                "SupplierIds": ["123456", "345632", "898495"]
        }]
}
</code></pre>
<p>然后变成C#代码我们就需要这样,为所有的<code>"</code>添加一个斜杠,作为转义字符:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112154425221.png" alt="" loading="lazy"></p>
<p>如果这样子看的不直观,我们想要多行表示,那需要这样,把一个<code>"</code>,变为两个<code>""</code>,然后才能输出:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112154733869.png" alt="" loading="lazy"></p>
<p>不过这些有IDE在,设置一下可以自动做转换,不过像没有代码层级还好,像下面这种情况简直就是要弄死强迫症,直接就输出了一些无用的空格。<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112155019567.png" alt="" loading="lazy"></p>
<p>在JSON这个场景没啥大问题,但是如果你写的是SQL,那每次和数据库服务器交互时,都会把这些无用的空格传递过去。所以不得不写成下面这样突兀的代码,把缩进全都给删除:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112155301846.png" alt="" loading="lazy"></p>
<h2 id="原始字符串">原始字符串</h2>
<p>有了原始字符串以后,一切都美好了起来,实现第一个需求,我们只需要首位添加<code>"""</code>即可:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112160422707.png" alt="" loading="lazy"></p>
<p>多行文本也不在话下,而且它以<code>"""</code>结束的那一列为准,不会输出多余的空格:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161459307.png" alt="" loading="lazy"></p>
<p>注意开头的<code>"""</code>和结尾的<code>"""</code>必须是单独占用一行,否则就会报错:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161741710.png" alt="" loading="lazy"></p>
<p>另外,也贴心的给我们做了字符串校验,如果某一行没有和开头的<code>"""</code>在同一列,那么会给出异常提示:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112161950960.png" alt="" loading="lazy"></p>
<p>那么有小伙伴就要问了,现在是字符串里面包含一个<code>"</code>符号可以解决,那假设我有一个地方包含两个<code>"</code>呢?这也很简单,只需要往前面再加<code>"</code>就可以了。如果要输出大于两个双引号,那么在原始字符串定义上加一个双引号即可,这是非常聪明的做法:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112162546629.png" alt="" loading="lazy"></p>
<p>另外原始字符串也支持字符串插值,比如下面的JSON,如果直接使用<code>$</code>,那么会报错,因为字符串内插的格式就是<code>$"ABC {变量} ABC"</code>,内插的字符需要使用括号包起来,但是JSON已经把括号使用了:<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164030569.png" alt="" loading="lazy"></p>
<p>聪明的你肯定想到了,是不是多加一个<code>$</code>,变成两个<code>$$</code>就行了呢?确实是这样的,在原来的基础上加多少<code>$</code>符号就决定了里面能有多少个相邻的<code>{</code>:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164243960.png" alt="" loading="lazy"></p>
<p>同样,我们想多输出几个<code>{</code>也是一样的道理,我就想把这一块JSON用<code>{{</code>括起来,还想用字符串内插就像下面这样做就可以了:<br>
<img src="https://incerry-blog-imgs.oss-cn-hangzhou.aliyuncs.com/image-CSharp11%e4%b9%8b%e5%8e%9f%e5%a7%8b%e5%ad%97%e7%ac%a6%e4%b8%b2-221112164411251.png" alt="" loading="lazy"></p>
<h2 id="总结">总结</h2>
<p>C#终于解决了这个多年压死强迫症的困扰,以前用JS的时候还会羡慕有"```"标识符,可以多行文本直接用,而且还不用写转义,而引以为豪的语法糖居然没有这个功能。</p>
<p>现在咱们也用上了,不过还有很多Rust、TypeScript的语法特性值得C#学习,C#还得加油呀!!!</p><br><br>
来源:https://www.cnblogs.com/InCerry/p/cs-11-raw-string.html
頁: [1]
查看完整版本: C#11之原始字符串