C# 11 新特性:原始字符串

之前

我们经常需要使用 string 类型定义字符串文本,字符串文本用一对双引号括起来表示:

var str = "Hello MyIO";

字符串可包含任何字符文本,但是有些字符需要转义才能表示,比如双引号要转义成\".

var str = "{\"K\":\"V\"}";

如果需要将文本多行显示,则需要插入回车换行,并且回车换行符要转义成\r\n

var str = "{\r\n \"K\":\"V\" \r\n}";

为了让代码更有可读性,可以用原义标识符@定义字符串,这时大部分字符不需要转义,但是双引号要转义成""

var str = @"{
    ""K"":""V""
}";

由于输出时会包含定义中的所有空格,所以在代码中不能将{}对齐

如果需要将字符串中的值用变量或表达式代替,可以用$将字符串文本标识为内插字符串:

var x = 1;
var y = 2;
var str = @$"
{{
    ""K"":""{x+y}""
}}";

由于{}是内插表达式的一部分,所以表示为字符的{}需要转义成使用两个大括号{{}}

C# 11

原始字符串文本从 C# 11 开始可用。原始字符串文本可以包含任意文本,而无需转义。

原始字符串文本用至少三个双引号括起来:

var str = """{"K":"V"}""";

当起始双引号和结束双引号位于单独的行上时,开头双引号后面的换行符和结束双引号前面的换行符不包括在最终内容中。可以缩进原始字符串文本以匹配整体代码格式:

var str = """
        {
            "K":"V"
        }
        """;

结束双引号指定字符串文本最左侧的列,前面的空格都会被忽略

当插入表达式时,需要用$$将字符串文本标识为内插字符串:

var x = 1;
var y = 2;
var str = $$"""
            {
                "K":"{{x + y}}"
            }
            """;

{{}}作为内插表达式的一部分,表示为字符的{}无需转义

将定义原始字符串文本的代码反编译,可以看到,字符串其实还是使用的一对双引号括起来表示。原始字符串只是 C# 11  为我们提供的一个语法糖

C# 11 新特性:原始字符串