总目录
前言
本文主要介绍 string literals
,string 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 新特性:原始字符串