![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=1738922335-QUpGrB5a21l8TzIcoLTfcTN8KKSDHL98-0-939ffc4bafa82bfa7a847a51a1196aa2)
转义序列指那些不能用字面量表示或解释的字符。转义字符由反斜线和一个表示特殊含义的字符组成,例如:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0070-05.jpg?sign=1738922335-M16ceDPWvEOBpBTuFhSAS9tPOcSq4aDa-0-8744593f71e687981348e022b21c5d51)
表2-2中列出了转义序列字符。
表2-2:转义序列字符
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0070-06.jpg?sign=1738922335-sXEF4IsnWiUp5tOEuRLVrfcXpfElTcCn-0-73b1d8e6c5b3a48d0399fb6dcfb1e149)
表2-2:转义序列字符(续)
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-01.jpg?sign=1738922335-xPEXuuv1tUsQYdnhrYM5Xps1tKxzsWKE-0-04aaf4a51ea724851f9dc5d13e80b2a6)
\u(或\x)转义字符通过4位十六进制代码来指定任意Unicode字符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-02.jpg?sign=1738922335-0cTI6aiwMuxgpP18OtS1zMvVa0SBxczG-0-4a944f0db4c73df42e1cafda1be1860a)
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=1738922335-lwUPDbwpxJmxGJhAHr2vft1j8n3sQ3ep-0-5d138adb8ffa3bbe50e2c0e84b9d5ff1)
string类型是引用类型而不是值类型,但是它的相等运算符却遵守值类型的语义:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-05.jpg?sign=1738922335-fczEGNLDFXyxQpSmIIpjUksvZXTVbsge-0-fa01482b20cdfdd2c2a1e3b04d0e39c7)
字符串中的转义字符和char字面量的转义字符是一致的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-06.jpg?sign=1738922335-et2oFKX6uf8W4ED76MdMKGg9G4w1ZFXj-0-6cb48c982c78bc5baa8dda00623fef0a)
这意味着当需要一个反斜杠时,需要写两次才可以:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0071-07.jpg?sign=1738922335-f73ULCO2uTIliJOXgJDYXslVWOLMzZy5-0-87a9379a96cfa9cbbb1d218e203929dc)
为避免这种情况,C#引入了原意字符串字面量。原意字符串字面量要加@前缀,它不支持转义字符。下面的原意字符串和之前的字符串是一样的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-01.jpg?sign=1738922335-xohJKh7ZDcBidX48xxNZgG1OovU49M57-0-8ef5a2c09eee5a35806257c851ac0c7f)
原意字符串可以贯穿多行:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-02.jpg?sign=1738922335-VuL2bcIMNuUeOh6eB4A7loVwM2UhIoqL-0-48e11a8ae2133c9802999f79b49ff054)
原意字符串中需要用两个双引号来表示一个双引号字符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-03.jpg?sign=1738922335-IohjFuCy3cRATpGVqhDVCDNdWo3MKgtS-0-0f434c74b566a0e3249d8045bd6550dd)
2.6.2.1 字符串连接
+运算符可连接两个字符串:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-04.jpg?sign=1738922335-w03GzWIFQBGvgLAYqAKtZFkiHdWI0AG8-0-74bd5b7e841db14ea715f5580bd6ea9b)
如果操作数之一是非字符串值,则会调用ToString方法将其转换为字符串:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-05.jpg?sign=1738922335-1f6FrILw9wabzrKXYyx2l8s9cXfbtwte-0-a33d6b714fea1bce67a7d9f3c72b1c58)
重复使用+运算符来构建字符串是低效的。更好的解决方案是使用System.Text.StringBuilder类型(将在第6章介绍)。
2.6.2.2 字符串插值
以$字符为前缀的字符串称为插值字符串。插值字符串可以在大括号内包含表达式:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-06.jpg?sign=1738922335-S788VaCXr3k6tf1sbu0Y8Nr29Ep7MDMU-0-8d0741e6fb58cf3e53bb6a3ac789af9d)
大括号内可以是任意类型的合法C#表达式。C#会调用ToString方法或等价方法将表达式转换为字符串。如需更改表达式的格式,可以使用冒号,并附加格式字符串(我们将在6.1.2.7节中进行详细介绍):
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-07.jpg?sign=1738922335-SAJa4wS5lp0LGTdhdBKNPuSTI1BNCmCE-0-256e20086cc0fb78d76640557c47d628)
如果代码中的冒号有其他用途(例如,三元条件运算符),则需要将整个表达式使用括号包裹起来:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-08.jpg?sign=1738922335-00muq3WBKJqIj5wHsIoudEOvawUHoPZ1-0-fc07c480d214015228076493961302c2)
插值字符串只能在单行内声明。如需在多行中声明字符串,请使用原意字符串运算符:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0072-09.jpg?sign=1738922335-lwRy3EYFVHkO4pNjpcXGwXFueaS88xsg-0-dbff727d15e4efa5ab75c2e27a1d1ad1)
若要在插值字符串中表示大括号,只需书写两个大括号字符即可。
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=1738922335-oBc2JntJmQU5gOdXa39fHmEwe7tC8PcU-0-fedaaa8edf987be168c2cdf604c58f2b)