![C# 10核心技术指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/89/52513089/b_52513089.jpg)
2.6 字符串和字符
C#的char(System.Char类型的别名)类型表示一个Unicode字符并占用两个字节(UTF-16)。char字面量应位于两个单引号之间:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0070-04.jpg?sign=1738833060-WF3odFT48iUfrRDJgbsPWaLeVA01TiI0-0-8c06accaa9d12e65cc1ff67e0c05ea93)
转义序列指那些不能用字面量表示或解释的字符。转义字符由反斜线和一个表示特殊含义的字符组成,例如:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0070-05.jpg?sign=1738833060-QR0HwOyXkRcMdpHZDGiCSTuDot0tSpak-0-1d5b9efdae9afc1ed5b177d102170e36)
表2-2中列出了转义序列字符。
表2-2:转义序列字符
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0070-06.jpg?sign=1738833060-L6vwxuHjfypn1gni2Ar4cfoeIuFol34s-0-adb70dd0948a09d4016a90a0bd26736f)
表2-2:转义序列字符(续)
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-01.jpg?sign=1738833060-4PIxZHr1F4gD4uTP3IDb1Tb7BzKifQie-0-a66bae570a2404e22bad7f983d7349b3)
\u(或\x)转义字符通过4位十六进制代码来指定任意Unicode字符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-02.jpg?sign=1738833060-A6IHB0qP5F6BZrq4Fg7bGZ261A14c6v7-0-9800c875734ae6834704d51ac81e636b)
2.6.1 char转换
若从char类型隐式转换为数值类型,则这个数值类型必须能够容纳无符号short类型。对于其他的数值类型,则需要显式转换。
2.6.2 字符串类型
C#中的字符串类型(System.String类型的别名,我们将在第6章详细介绍)表示不可变(创建之后即无法更改)的Unicode字符序列。字符串字面量应位于两个双引号之间:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-03.jpg?sign=1738833060-diMTOilaGyLJovozKPEX4ID8rO02TqEP-0-7bf79854613050c266ffd570f75cb5b0)
string类型是引用类型而不是值类型,但是它的相等运算符却遵守值类型的语义:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-05.jpg?sign=1738833060-KZ2doRceAIR1uAnG72QEBjAiFRiauPfV-0-cc9cf3d2087cdd6556d55a86795f918c)
字符串中的转义字符和char字面量的转义字符是一致的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-06.jpg?sign=1738833060-5GsdK5X2xLdqGsBdPBJG22sBSKdy5TW4-0-338e8babad3517cbba00645490baf6d0)
这意味着当需要一个反斜杠时,需要写两次才可以:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-07.jpg?sign=1738833060-BdIUEp5sRvI9wFI2L0hNLbr5S9wdeqvN-0-f882483a764935f5e29af110d9a497d1)
为避免这种情况,C#引入了原意字符串字面量。原意字符串字面量要加@前缀,它不支持转义字符。下面的原意字符串和之前的字符串是一样的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-01.jpg?sign=1738833060-hh3xPXIu9JJFum4UR3zKn6H4CwvtQh7o-0-a1a7b360355c2ebde8cdb8ea7a2a334b)
原意字符串可以贯穿多行:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-02.jpg?sign=1738833060-HeBimPVJ4zzvLrkgo566FR1q6Jm2ozk1-0-3b89a0639eb99d3b2de74ea8e61825e2)
原意字符串中需要用两个双引号来表示一个双引号字符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-03.jpg?sign=1738833060-oAzRISojujMr8CTbF14DKGIDrQh48BOj-0-a47d19445169323747ae62aadcb3ea37)
2.6.2.1 字符串连接
+运算符可连接两个字符串:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-04.jpg?sign=1738833060-7uWtrvbHoXydqUnYrg0XSYghACoQG8Nx-0-ffecc464b35228a45e901f1d0e612ec6)
如果操作数之一是非字符串值,则会调用ToString方法将其转换为字符串:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-05.jpg?sign=1738833060-b9t93iSUKS6W3ZrJJlKwtbmIssCihH5q-0-afe0e1d5984093e972769539efb57e7e)
重复使用+运算符来构建字符串是低效的。更好的解决方案是使用System.Text.StringBuilder类型(将在第6章介绍)。
2.6.2.2 字符串插值
以$字符为前缀的字符串称为插值字符串。插值字符串可以在大括号内包含表达式:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-06.jpg?sign=1738833060-oC3pcxs7ls5UU04F7PGP55bPkQa3JKMN-0-58a8f5e7b3172ded5f847067b2899513)
大括号内可以是任意类型的合法C#表达式。C#会调用ToString方法或等价方法将表达式转换为字符串。如需更改表达式的格式,可以使用冒号,并附加格式字符串(我们将在6.1.2.7节中进行详细介绍):
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-07.jpg?sign=1738833060-ph3wMMz60vc3hdXK4QvEkoKME38ksn7W-0-b6dd0024ef6d3e9904b080fdb4d5ddf2)
如果代码中的冒号有其他用途(例如,三元条件运算符),则需要将整个表达式使用括号包裹起来:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-08.jpg?sign=1738833060-1LRaC5YkOcMRAlO0UX0RfnnCcIwplKnA-0-161f9dce1723e27a9a050d77f90bcdc6)
插值字符串只能在单行内声明。如需在多行中声明字符串,请使用原意字符串运算符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-09.jpg?sign=1738833060-d8objkybK2mm3Bq6xU07Jo12UKiMvvTV-0-f61079603d7d57ea2b7eac6c2e2d6a8f)
若要在插值字符串中表示大括号,只需书写两个大括号字符即可。
2.6.2.3 字符串比较
string类型不支持<和>的比较,必须使用字符串的CompareTo方法。我们将在第6章介绍这部分内容。
2.6.2.4 常量字符串插值(C# 10)
从C# 10开始,如果字符串插值中的值为常量(字符串),则插值后的字符串仍然可以是常量:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0073-01.jpg?sign=1738833060-hXtNRMKnx7223xohh4OQcunSJBhWBzTX-0-d3906aea3bdde6149f7b2a18cb5dc715)