首页 / C# / 正文

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

315 发布于: 2022-08-02 09:03 读完约需 5 分钟

朋友们大家好,我是Rector,码友网的创建者和维护者,专注C#&.NET技术开发。

本文为大家分享的主题是《C# 11新特性之原始字符串》,本文相应的视频: C# 11新特性-原始字符串

概述

美国时间2022年4月18日,微软发布了Visual Studio 17.2 预览版 3和.NET 7预览版 3,其中包含了一些C# 11的新特性,本视频就为大家演示一下C# 11中的原始字符串这个新特性。

微软官方的表述是:” Raw string literals”,这里翻译成”原始字符串”。从字面不难看出,它是适用于字符串的新特性,解决字符串中特殊字符的新语法。

原始字符串字面量可以包含任意文本,包括空格、新行、嵌入的引号及其他特殊字符。
原始字符串字面值至少以三个双引号(“””)字符开头,以相同数量的双引号字符结束。通常,原始字符串文字在一行使用三个双引号开始字符串,在另一行使用三个双引号结束字符串。

单从概念上理解起来可能并不是那么直接,下面我们以示例来逐一说明。

以前,C#字符串类型的变量 内容中如果包含英文状态下的双引号,则将出现编译错误,除非对文本内容中的每个双引号进行转义。比如,这里我们声明一个字符串类型的变量proverb

string proverb = "英语中有句谚语:"Actions speak louder than words!",翻译成中文的意思是:“行动比语言更有说服力!”";

以上语句中,Actions...这句话直接使用双引号是不被允许的,编译器会报语法错误。修复的方法是将文本内容中的引号进行转义,如:…

有了C# 11中的原始字符串这一新特性,上面的转义问题便可迎刃而解。

由于是预览版,默认情况下未开始C# 11的语法,如需开启预览版的C#语法,则请在项目的配置文件中设置LangVersion的值为preview

原始字符串

原始字符串字面量可以包含任意文本,而不需要转义序列。原始字符串字面量可以包括空格、新行、嵌入的引号和其他特殊字符。原始字符串文字包含在至少三个双引号中(""")

var str = """
这是一个多行文本
    原始字符串的测试。
""";

你甚至可以包含一个或更多双引号字符。如果文本需要嵌入引号序列,则可以根据需要在原始字符串字面量的开始和结束处使用更多的引号。

var str = """""
这句话需要在文本中输出4个英语状态下的双引号:"""",那开始和结束就需要至少5个双引号。
""""";
Console.WriteLine(str);
Console.ReadKey();

C# 11的语法规则中,原始字符串字面量的起始和结束引号是可以放在同一行的,比如:

var message = """原始字符串字面量的起始和结束引号通常位于与嵌入文本分开的行中。""";

格式化

但为了代码可读性,原始字符串字面量的起始和结束引号通常位于与嵌入文本分开的行中,比如我们可以将其格式化成如下的形式:

var message = """
原始字符串字面量的起始和结束引号通常位于与嵌入文本分开的行中。
""";
Console.WriteLine(str);
Console.ReadKey();

也就是:开始和结束的三个双引号与字符串内容在不同的行中。

缩进

如果起始引号和结束引号位于不同的行中,你可以使用制表符或者空格对原始字符串进行缩进,以保持整体的代码风格,但要确保结束引号的左边与文本内容的最左边对齐。

var str = """
          原始字符串字面量的起始和结束引号通常位于与嵌入文本分开的行中。
            第二行
          """;
Console.WriteLine(str);
Console.ReadKey();

如果字符串内容是以双引号开始的文本,则必须将开始和结束引号指示器放在与内容不同的行。

var proverb = """
    "Actions speak louder than words!"是英文中的一句谚语。
    """;
Console.WriteLine(proverb);
Console.ReadKey();

转义字符不生效

原始字符串没有转义。例如,一个反斜杠输出为一个反斜杠,而\t输出为反斜杠和一个t,而不是制表符。

var str1 = """制表符不生效\t,将原样输出\n这里不会换行。""";
Console.WriteLine(str1);
Console.ReadKey();

字符串插值语法

原始字符串字面值可以通过在其前面加上$来使用字符串插值语法。字符串前缀$的数量表示嵌套代码表达式所需的花括号的数量。也就是说:$的行为类似于现有的字符串插值,一组花括号表示嵌套代码。如果原始字符串字面值以两个$$作为前缀,则单个花括号({)被视为内容,它接受两个花括号来表示嵌套的代码。

var name = "Rector";
var str1 = $"""大家好,我是{name},一个$的时候,没办法在内容中输出花括号。""";
var str2 = $$"""大家好,我是{{name}},我是可以输出花括号的({})啊。""";
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.ReadKey();

处理JSON的好处

有了原始字符串这一新特性之后,json字符串就很好书写了。比如,如下的json字符串:

{"name": "Rector","gender":"male","weight": 60,"unit":"kg"}

原来的语法需要将文本中的每一个双引号使用斜杠进行转义,如下:

var json = "{\"name\": \"Rector\",\"gender\":\"male\",\"weight\": 60,\"unit\":\"kg\"}";

原始字符串的写法:

var json = """{"name": "Rector","gender":"male","weight": 60,"unit":"kg"}""";
Console.WriteLine(json);
Console.ReadKey();

还可以对json原始字符串进行格式化,如下:

var json = """
            {
                "name": "Rector",
                "gender":"male",
                "weight": 60,
                "unit":"kg"
            }
            """;
Console.WriteLine(json);
Console.ReadKey();

最后,我们也可以使用插值法来动态插入json属性的值,如下:

var name = "Rector";
var gender = "male";
var weight = 60;
var json = $$"""
            {
                "name": {{name}},
                "gender": {{gender}},
                "weight": {{weight}},
                "unit":"kg"
            }
            """;
Console.WriteLine(json);
Console.ReadKey();

以上就是本期为大家分享的C# 11的新特性之原始字符串。有什么问题,欢迎大家在评论区留言反馈。

我是Rector,感谢您的关注。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [亲测]VMware虚拟机中实现Ubuntu 20.04磁盘(mapper/ubuntu--vg-ubuntu--lv)扩容

本文永久链接码友网 » C# 11新特性之原始字符串

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册