C#11中的 Raw String Literal

Intro

C# 11 中将引入一个有意思的特性 —— Raw string Literal, 翻译一下就是原始的字符串字面值,是不是感觉有点绕,简单说就是字符串中的内容是什么就输出什么,不需要转义,看下面的示例应该就能明白了.

Sample

多行的文本,在之前的 C# 版本中我们会使用 @ 来进行声明,如下:

var testString = @"HTTP/1.1 200 OK
Connection: keep-alive
Date: Wed, 23 Mar 2022 14:05:03 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunked
X-dotnet-HTTPie-Duration: 720.0249ms
X-dotnet-HTTPie-ResponseTimestamp: 2022/3/23 22:05:03 +08:00";

在 C# 11 中我们可以使用三个引号 """ 来声明,示例如下:

var testString = """
HTTP/1.1 200 OK
Connection: keep-alive
Date: Wed, 23 Mar 2022 14:05:03 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunked
X-dotnet-HTTPie-Duration: 720.0249ms
X-dotnet-HTTPie-ResponseTimestamp: 2022/3/23 22:05:03 +08:00
""";
Console.WriteLine(testString);

输出结果如下:

C#11中的 Raw String Literal

这似乎并不能体现它带来的好处,我们接着来看一个示例,一个格式化后的 Json 字符串,使用 @ 的时候我们的字符串中有引号的话就需要进行转义,示例如下:

var rawJson = @"{
  ""name"": ""test"",
  ""age"": 10
}";

使用 C# 11 中的三个引号的方式进行声明就会简单很多,就会变成下面这样:

var rawJson = """
{
  "name": "test",
  "age": 10
}
""";
Console.WriteLine(rawJson);

这样在很多时候我们就可以直接赋值粘贴过来一段文本了,就不需要进行转义转换了,很多时候就会非常的方便了

上述输出结果如下:

C#11中的 Raw String Literal

不仅仅适用于多行,单行的文本也可以是可以用的,比如:

Console.WriteLine("""<div style="color:red">Amazing .NET</div>""");

C#11中的 Raw String Literal

从 C# 6.0 开始,开始支持字符串插值的写法,对于新的字符串声明方式也是支持字符串插值的,只是使用方式稍有不同,我们来看一个示例:

var interpolatedString = $$"""
{
  "name": "test",
  "age": {{10}}
}
""";
Console.WriteLine(interpolatedString);

在之前的字符串插值中,在字符串前只需要一个 $,对于 Raw string literal 的方式则需要两个,同样的对于参数原本只需要一对大括号 {} 现在也需要两对大括号才可以 {{}}

输出结果和上面的相同

C#11中的 Raw String Literal

More

对于这个新特性,我个人还是比较喜欢的,感觉还是比较方便的

前面说的三个引号是一般情况下,如果你的内容里也有三个引号,那你可以使用4个引号甚至更多

var oh = """"
    Ok to use """ here
    """";
Console.WriteLine(oh);