C#中的多行字符串字面量

C#中的多行字符串字面量

技术背景

在编程过程中,我们常常需要处理多行字符串。在C#里,处理多行字符串有多种方式,不同方式适用于不同场景。理解这些方法能帮助开发者更高效地编写代码,提高代码的可读性和可维护性。

实现步骤

使用@符号创建逐字字符串字面量

string前使用@符号可形成逐字字符串字面量,它允许字符串跨越多行,且除双引号外无需转义特殊字符。示例如下:

1
2
3
string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

使用$进行字符串插值

若要在字符串中间添加值,可使用$。示例如下:

1
2
string text = "beer";
string query = $"SELECT foo {text} bar ";

结合$@实现多行字符串插值

若要在多行字符串中间添加值,可结合使用$@。示例如下:

1
2
3
4
string text = "Customer";
string query = $@"SELECT foo, bar
FROM {text}Table
WHERE id = 42";

使用C# 11的原始字符串字面量

C# 11引入了原始字符串字面量,使用三个双引号"""表示,能更方便地使用双引号而无需编写转义序列。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
string query1 = """
SELECT foo, bar
FROM table
WHERE id = 42
""";

string query2 = """
SELECT foo, bar
FROM table
WHERE id = 42
and name = 'zoo'
and type = 'oversized "jumbo" grand'
""";

结合原始字符串字面量和字符串插值

在C# 11中,还能将原始字符串字面量与字符串插值结合使用。示例如下:

1
2
3
4
5
6
7
var someValue = 23.45f;
var json = $$"""
{
"summary": "text",
"value" : {{someValue}},
};
""";

拆分字符串但不引入换行符

若要将字符串拆分为多行,但不引入换行符到实际字符串中,可引入计算结果为空的代码。示例如下:

1
2
3
4
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";

核心代码

完整示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;

namespace Demo {

class Program {

static void Main(string[] args) {
// 使用@创建多行字符串
string str = @"Welcome User,
Kindly wait for the image to
load";
Console.WriteLine(str);

// 使用$进行字符串插值
string text = "beer";
string query1 = $"SELECT foo {text} bar ";
Console.WriteLine(query1);

// 结合$和@进行多行字符串插值
string text2 = "Customer";
string query2 = $@"SELECT foo, bar
FROM {text2}Table
WHERE id = 42";
Console.WriteLine(query2);

// 使用C# 11的原始字符串字面量
string query3 = """
SELECT foo, bar
FROM table
WHERE id = 42
""";
Console.WriteLine(query3);

// 结合原始字符串字面量和字符串插值
var someValue = 23.45f;
var json = $$"""
{
"summary": "text",
"value" : {{someValue}},
};
""";
Console.WriteLine(json);

// 拆分字符串但不引入换行符
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";
Console.WriteLine(s);
}
}
}

最佳实践

  • 提高可读性:在处理SQL查询、JSON字符串等较长字符串时,使用逐字字符串或原始字符串字面量可提高代码的可读性。
  • 避免不必要的转义:使用逐字字符串或原始字符串字面量可避免编写大量转义字符,减少出错的可能性。
  • 结合字符串插值:在需要动态插入值的场景中,结合使用字符串插值可使代码更简洁。

常见问题

双引号的转义

在逐字字符串中,若要使用双引号,需添加额外的双引号符号。示例如下:

1
string quote = @"Jon said, ""This will work,"" - and it did!";

字符串格式化中的花括号转义

在使用string.Format时,若字符串字面量中包含花括号{},需对其进行转义。示例如下:

1
2
3
4
5
6
// 会抛出格式异常
string.Format(@" <script> function test(x)
{ return x * {0} } </script>", aMagicValue);
// 此示例可行
string.Format(@" <script> function test(x)
{{ return x * {0} }} </script>", aMagicValue);

编译器优化

使用+连接字符串字面量时,编译器会进行优化,但不同版本的编译器可能存在差异。若依赖编译器优化,需确保代码在不同环境中能正常工作。


C#中的多行字符串字面量
https://119291.xyz/posts/csharp-multiline-string-literal/
作者
ww
发布于
2025年7月15日
许可协议