C# 字符串文本 详解

总目录


前言

本文主要介绍 string literalsstring literals 在MSDN 中文文档中有翻译成 字符串字面量 也有翻译成字符串文本 的,本文统一使用字符串文本


一、介绍

在使用C# 编程的过程中,通过会使用string 类型 来定义 字符串文本。

二、字符串文本

1. 带引号的字符串文本

1)正常使用

  • 带引号的字符串文本在同一行上以单个双引号字符 (") 开头和结尾。
csharp 复制代码
		string str = "hello world!";
  • 带引号的字符串文本最适合匹配单个行且不包含任何转义序列的字符串。
  • 带引号的字符串文本,可以包含任何字符文本,但是某些内容需要使用转义符才能正确表示

2)包含转义符的使用

  • 当需要用string 表示一个路径的时候,如果直接用路径表示,则会报错;加上 \ 转义符后,才得以正确的表示路径
csharp 复制代码
        static void Main(string[] args)
        {
            string path = "E:\\MyCode\\my-study";
            Console.WriteLine(path);    //输出:E:\MyCode\my-study
        }
  • 当我们想要输出 带有 "" 的字符串文本的时候,我们同样需要加上 \ 转义符
csharp 复制代码
        static void Main(string[] args)
        {
            string str = "{\"K\":\"V\"}";
            Console.WriteLine(str);    //输出:{"K":"V"}
        }
  • 当我们想要输出 可以换行的字符串文本的时候,我们需要加上 \r\n
csharp 复制代码
        static void Main(string[] args)
        {
            string str = "{\r\n \"K\":\"V\" \r\n}";
            Console.WriteLine(str);
            /*
             输出:
             {
                "K":"V"
              }
             */
        }

在使用带引号的字符串文本的时候,我们发现在想正确的表示某些字符串文本的时候,需要加上各种各样的转义符,还得逐个添加,其实是极其的不方便。因此带引号的字符串文本最适合匹配单个行且不包含任何转义序列的字符串。

2. 逐字字符串文本

1)正常使用

  • 对于多行字符串、包含反斜杠字符或嵌入双引号的字符串,逐字字符串文本更方便。
  • 逐字字符串将新的行字符作为字符串文本的一部分保留。 使用双引号在逐字字符串内部嵌入引号。
  • 逐字字符串文本 使用@ 符号 定义字符串文本,这时大部分的字符不需要转义符转移,只是" 要转义成 ""
csharp 复制代码
        static void Main(string[] args)
        {
            string path = @"E:\MyCode\my-study";
            Console.WriteLine(path); 

            string str = @"{""K"":""V""}";
            Console.WriteLine(str);          

            string quote = @"我的名字叫 ""鲤籽鲲。""";
            Console.WriteLine(quote);        

            string str2 = @"大家好,
我叫鲤籽鲲,很高兴认识大家!";
            Console.WriteLine(str2);
 
        }

可以将逐字字符串文本理解为 带引号的字符串文本的 升级版,大部分的字符不需要转义符转移,只是" 要转义成 "",感觉还是不够直观。

2)与$ 符号一起使用

csharp 复制代码
        static void Main(string[] args)
        {
            string name = "鲤籽鲲";
            string str = $@"我的名字叫 ""{name}。""";
            Console.WriteLine(str);     //我的名字叫 "鲤籽鲲。"
        }
csharp 复制代码
        static void Main(string[] args)
        {
            string nickName = "小鲤鱼";
            string str = $@"我的昵称叫做:{{nickName}}";
            Console.WriteLine(str);     // 我的昵称叫做:{nickName}


            str = $@"我的昵称叫做:{{{nickName}}}";
            Console.WriteLine(str);     // 我的昵称叫做:{小鲤鱼}
        }
  • 当 @ 和 $ 内插字符串符号一起使用的时候,如果想要输出{},则需要转义成{``{}}
    • 如上例中 {``{nickName}} 是无法解析string的值,而{``{``{nickName}}} 可以解析

3. 原始字符串文本

  • 从 C# 11 开始,可以使用原始字符串文本更轻松地创建多行字符串,或使用需要转义序列的任何字符。
  • 原始字符串文本无需使用转义序列。 你可以编写字符串,包括空格格式,以及你希望在输出中显示该字符串的方式。
  • 原始字符串文本:
    • 以至少三个双引号字符序列 (""") 开头和结尾。
    • 可以使用三个以上的连续字符开始和结束序列,以支持包含三个(或更多)重复引号字符的字符串文本。
    • 单行原始字符串字面量需要左引号和右引号字符位于同一行上。
    • 多行原始字符串字面量需要左引号和右引号字符位于各自的行上。
    • 在多行原始字符串字面量中,会删除右引号左侧的任何空格。

1)正常使用

以至少三个双引号字符序列 (""") 开头和结尾 表示原始字符串文本,无需使用转义序列。

csharp 复制代码
        static void Main(string[] args)
        {
            string path = """E:\MyCode\my-study""";
            Console.WriteLine(path);        //E:\MyCode\my-study

            string str = """{"K":"V"}""";
            Console.WriteLine(str);         //{"K":"V"}

            string quote = """我的名字叫 ""鲤籽鲲。"" """;
            Console.WriteLine(quote);       //我的名字叫 ""鲤籽鲲。""
        }

2)输出大于3个双引号的字符串文本

可以使用三个以上的连续字符开始和结束序列,以支持包含三个(或更多)重复引号字符的字符串文本。

csharp 复制代码
        static void Main(string[] args)
        {
            Console.WriteLine(""" "C#/.NET" """);               // "C#/.NET"
            Console.WriteLine(""" ""C#/.NET"" """);             // ""C#/.NET""
            Console.WriteLine("""" """C#/.NET""" """");         // """C#/.NET"""
            Console.WriteLine(""""" """"C#/.NET"""" """"");     // """"C#/.NET""""
        }

3)单行原始字符串文本

单行原始字符串字面量需要左引号和右引号字符位于同一行上。

正确使用:

csharp 复制代码
string singleLine = """Friends say "hello" as they pass by.""";

错误使用:

csharp 复制代码
// CS8997: Unterminated raw string literal.
var multiLineStart = """This
    is the beginning of a string 
    """;

// CS9000: Raw string literal delimiter must be on its own line.
var multiLineEnd = """
    This is the beginning of a string """;

3)多行原始字符串文本

多行原始字符串字面量需要左引号和右引号字符位于各自的行上。

正确使用:

csharp 复制代码
string multiLine = """
    "Hello World!" is typically the first program someone writes.
    """;
string embeddedXML = """
       <element attr = "content">
           <body style="normal">
               Here is the main text
           </body>
           <footer>
               Excerpts from "An amazing story"
           </footer>
       </element >
       """;

错误使用:

csharp 复制代码
// CS8999: Line does not start with the same whitespace as the closing line
// of the raw string literal
var noOutdenting = """
    A line of text.
Trying to outdent the second line.
    """;


4)与 $ 符号一起使用

csharp 复制代码
            static void Main(string[] args)
            {
                string name = "鲤籽鲲";
                string str = $""" ""我的名字叫 ""{name}。"" """;
                Console.WriteLine(str);     //我的名字叫 "鲤籽鲲。"
            }
csharp 复制代码
        static void Main(string[] args)
        {
            string nickName = "小鲤鱼";
            string str = $$""" 我的昵称叫做:{{nickName}}""";
            Console.WriteLine(str);     //  我的昵称叫做:小鲤鱼


            str = $$""" 我的昵称叫做:{{{nickName}}} """;
            Console.WriteLine(str);     // 我的昵称叫做:{小鲤鱼}

            str = $$$""" 我的昵称叫做:{{{nickName}}} """;
            Console.WriteLine(str);     // 我的昵称叫做:小鲤鱼
        }
  • 当原始字符串文本与$ 一起使用的时候,如果需要解析{}中变量的值,则需要通过1个或多个$ 进行解析
    • {} 包了多少层,那么$ 就需要使用多少个

5)小结

  • 使用带引号的字符串文本或逐字字符串文本时,如果生成的文本包括需要转义序列的字符,应考虑原始字符串文本。
  • 原始字符串字面量将更易于你和其他人阅读,因为它更类似于输出文本
    • 例如使用原始字符串文本 表示 Json字符串 会相较于前两种方法更易阅读
csharp 复制代码
string jsonString = """
{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "Hot",
  "DatesAvailable": [
    "2019-08-01T00:00:00-07:00",
    "2019-08-02T00:00:00-07:00"
  ],
  "TemperatureRanges": {
    "Cold": {
      "High": 20,
      "Low": -10
    },
    "Hot": {
      "High": 60,
      "Low": 20
    }
            },
  "SummaryWords": [
    "Cool",
    "Windy",
    "Humid"
  ]
}
""";

4. 字符串转义序列

  • \字符 - 转义字符(Escape Character),\字符用于创建转义序列,表示特殊字符或控制字符。

  • 常见的转义序列包括:

    • \\ - 表示反斜杠字符本身。
    • \" - 表示双引号字符。
    • \' - 表示单引号字符。
    • \n - 表示换行符。
    • \r - 表示回车符。
    • \t - 表示制表符。
    • ...
  • \\ 使用案例

csharp 复制代码
        static void Main(string[] args)
        {
            string path = "E:\\MyCode\\my-study";
            Console.WriteLine(path);    //输出:E:\MyCode\my-study
        }
  • \"使用案例
csharp 复制代码
        static void Main(string[] args)
        {
            string str = "{\"K\":\"V\"}";
            Console.WriteLine(str);    //输出:{"K":"V"}
        }
  • \t使用案例
csharp 复制代码
        static void Main(string[] args)
        {
            string columns = "Column 1\tColumn 2\tColumn 3";
            Console.WriteLine(columns);
        }
  • \r\n使用案例
csharp 复制代码
string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
    Row 1
    Row 2
    Row 3
*/
  • \b使用案例
    \b 去掉上一个字符
csharp 复制代码
        static void Main(string[] args)
        {
            string str = "hello\b world !";
            Console.WriteLine(str);     //hell world !
        }
  • \u使用案例
csharp 复制代码
string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

结语

回到目录页:C# 知识汇总

希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
字符串和字符串字面量
原始字符串字面量 - 字符串字面量中的 """
内置引用类型(C# 引用)
String 类
System.String 类
C#11的原始字符串
C# 11 新特性:原始字符串

相关推荐
2401_898410691 分钟前
CSS语言的软件工程
开发语言·后端·golang
Akzeptieren11 分钟前
Python字符串的格式化
开发语言·python
wangnaisheng16 分钟前
【WPF】使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃
c#·wpf
DevOpsDojo19 分钟前
Bash语言的函数实现
开发语言·后端·golang
Lang_xi_21 分钟前
bash相关习题复习
开发语言·bash
DevOpsDojo22 分钟前
Bash语言的软件工程
开发语言·后端·golang
摇光~23 分钟前
【shell编程】报错信息:bash: bad file descriptor(包含6种解决方法)
开发语言·ssh·bug·bash·shell
Jason-河山32 分钟前
如何利用Java爬虫批量获取商品信息
java·开发语言·爬虫
云端 架构师36 分钟前
Elixir语言的正则表达式
开发语言·后端·golang
雯0609~44 分钟前
PHP:PHP脚本通过正则表达式动态修改指定文件下的php文件的sql内容加入指定条件enable_flag = ‘Y‘(“Y“)
开发语言·php