首页 / C# 入门教程 / 字符串字面量

C# 入门教程

字符串字面量

本教程共 100 篇 · 第 13 篇 · 更新于 2026-07-31 · 约 9 分钟阅读

C#C# 入门教程字符串原始字符串插值字符串

13. 字符串字面量

本节目标:分清四种字符串字面量写法,知道什么时候该用逐字字符串、插值字符串和原始字符串。

字符串(string)是编程里最高频的类型之一。C# 提供四种”写法”,各有地盘。选对写法,引号、斜杠、换行都不再是麻烦。

普通字符串

最常用,用双引号包住。里面的反斜杠表示转义,比如 \n 换行、\" 引号:

namespace CSharpDemo;

string msg = "你好,\n世界";
string path = "C:\\Users\\Admin";   // 每个 \ 都要写成 \\
Console.WriteLine(msg);
Console.WriteLine(path);

问题在于:一旦反斜杠多起来(比如 Windows 路径、正则),满屏 \\ 很刺眼,也容易写错。

逐字字符串(@ 前缀)

@ 前缀,反斜杠就当普通字符,不再转义。适合路径和正则:

string path = @"C:\Users\Admin";      // 不用写 \\
string regex = @"\d+\.\d+";           // 正则原样写
Console.WriteLine(path);

要在逐字字符串里放双引号,得写两个双引号 "" 表示一个:

string quote = @"他说:""你好""";      // 输出:他说:"你好"
Tip

路径、正则、SQL 这类”反斜杠是内容本身”的文本,优先用 @"...",可读性立刻提升。第 14 章我们还会写带换行的逐字字符串。

插值字符串($):

$ 前缀,就能在 { } 里嵌入变量或表达式,自动拼成字符串:

string name = "小明";
int age = 18;
string info = $"姓名:{name},年龄:{age}";
Console.WriteLine(info);

{ } 里不仅可以放变量,还能写简单运算:$"明年年龄:{age + 1}"。这比用 + 拼接清爽太多,是本教程的默认拼接方式。

组合:插值 + 逐字($@)

$@ 可以叠用,变成既能插值又有逐字行为的字符串:

string folder = "Admin";
string full = $@"C:\Users\{folder}\Documents";
Console.WriteLine(full);   // C:\Users\Admin\Documents

顺序无所谓,$@"..."@$"..." 都行。适合”带变量、又含反斜杠”的路径拼接。

原始字符串字面量("""):C# 11 新写法

当内容里既有大量引号、又有反斜杠、还要多行时,前三种都嫌累。C# 11 引入原始字符串字面量(raw string literal),用三个双引号 """...""" 包住:

string json = """
{
    "name": "小明",
    "age": 18
}
""";
Console.WriteLine(json);

它的好处是:里面的引号、反斜杠全部原样,不用任何转义;还能直接跨多行。写 JSON、SQL、XML、HTML 时尤其香。

Note

原始字符串的定界符 """ 数量可以更多(如 """"...""""),用于内容本身包含 """ 的极端情况。普通场景三个足够。基准 C# 14 完全支持,放心用。

插值也能进原始字符串

原始字符串同样支持插值,把 $ 放在前面即可:

string name = "小明";
string greeting = $"""你好,{name}!"欢迎"光临。""";
Console.WriteLine(greeting);

注意里面那对 "欢迎" 是普通双引号,因为原始字符串不吃转义,直接写就行。想在一个字符串里同时插值又保留引号,这是最干净的写法。

四种写法怎么选

场景推荐写法
简短文字、少量转义普通 "..."
路径、正则(反斜杠多)逐字 @"..."
需要嵌入变量/表达式插值 $"..."
JSON/SQL/多行/引号多原始 """..."""
Tip

别再用手动 + 拼字符串了。日常用 $"...";遇到复杂多行文本,立刻想到 """..."""。这是现代 C# 最省心的组合。

原始字符串的缩进规则

""" 时有个细节容易踩:结束的 """ 所在的列,决定了整个内容”去掉多少前导空格”。简单说,内容相对结束符缩进了多少,编译器就帮你削掉多少。

string xml = """
    <root>
        <item>值</item>
    </root>
    """;

这里每行前面有四个空格,结束符也在第四列,所以输出时那四个空格会被去掉,保留的是内容本身的层级。若结束符顶格写,则内容里所有前导空格都保留。

Note

这条规则初看绕,但记住一句:让内容的缩进和结束 """ 对齐,结果最直观。写多了自然就顺了。

字符串前加 @ 和 $ 的顺序

@$ 谁先谁后都合法:@$"..."$@"..." 等价。团队里挑一种统一即可。个人偏好 $@,因为”这是带插值的逐字字符串”读起来顺。

Tip

别在原始字符串 """ 里混用 $ 又忘记插值。若你写了 $""",里面的 {name} 会被当插值;若没加 $,花括号就当普通字符。明确你要的是哪种。

常见疑问解答

问:普通字符串里换行怎么写?\n 转义:"第一行\n第二行"。若用逐字字符串 @"...",则可直接按回车键换行,更直观。但 @"..."\ 不再是转义,写路径正合适。

问:原始字符串一定要三个引号吗? 至少三个,但可以更多。内容是普通 JSON/SQL 时 """ 足够;若内容里本身出现 """,就把定界符加到四个 """" 以区分。初学者记住”三个起步”即可。

问:插值字符串里能写复杂表达式吗? 能,但别太复杂。简单运算、?.、方法调用都可以;若逻辑一长,建议先算好存进变量,再插值,可读性更好。插值里也能用格式:{price:C} 直接出货币格式。

要点速记

  • 普通 "..." 适合短文本;@"..." 适合路径/正则。
  • $"..." 插值拼变量,日常首选。
  • $@ 组合插值与逐字;"""...""" 原始字符串管多行/引号。
  • 大量引号反斜杠的文本,原始字符串最干净。

动手练一练

  1. 用原始字符串 """...""" 写一段带引号和换行的 JSON,体会它免转义的好处。
  2. 用插值字符串 $"姓名:{name}" 拼接一个变量,再改成逐字插值 $@"C:\{name}" 拼接路径。
  3. 对比普通字符串写 Windows 路径要几个反斜杠,和逐字字符串 @"..." 各写一次,感受可读性差异。

插值里的格式控制

插值不只是塞变量,还能在 { } 里加格式符和对齐。比如数字补零、小数保留位数:

decimal price = 9.9m;
Console.WriteLine($"价格:{price,10:C}");   // 右对齐 10 宽,货币格式
int n = 7;
Console.WriteLine($"编号:{n:D3}");          // 007,补零到 3 位

逗号后的 10 是”最小宽度”,C/D3 是格式。这让插值既能拼值又能顺手排版,比先 ToString 再拼更紧凑。

四种写法的速查

再强调一次选择逻辑,免得你每次纠结:

  • 短文字、少量转义 → 普通 "..."
  • 路径、正则(反斜杠是内容) → 逐字 @"..."
  • 要嵌入变量/表达式 → 插值 $"..."
  • JSON/SQL/多行/引号多 → 原始 """..."""
Tip

一个实用信号:当你在字符串里开始数反斜杠、或者为了换行发愁,立刻换成 @"""。现代 C# 给了你更省心的工具,别跟转义较劲。

小结与下一步

四种字面量不是噱头,是分别解决”转义噪音""拼接麻烦""多行引号”的痛点。插值字符串和原始字符串是 C# 现代写法的代表,早点习惯。

下一章我们动手操作字符串:拼接、截取、比较、格式化,以及大量拼接时为何要用 StringBuilder。