c# 11 的原始字符串字面量(""")完全不处理转义,支持自然换行和直接嵌入双引号,结尾"""独占一行并自动剪裁其前导缩进;而@""仅跳过转义但需""表示引号、不支持多行且无缩进处理。

什么是 C# 的原始字符串字面量(""")
从 C# 11 开始,"""(三个双引号)定义的字符串是真正的原始字符串字面量:它不处理任何转义序列,换行、反斜杠、引号都按字面意义保留。这和旧式 @"" 字符串不同——@"" 只跳过转义,但依然要求双引号成对出现且需写成 "" 表示一个引号;而 """ 允许直接嵌入未转义的双引号,也支持自然换行。
""" 的基本写法与缩进处理
原始字符串以 """ 开头,也以 """ 结尾,中间内容完全照搬。但要注意:结尾的 """ 必须独占一行,且其前导空白(空格或制表符)会从整段字符串中“自动剪裁”——剪裁依据是结尾引号所在行的最小缩进量。
常见错误现象:""" 后换行后直接缩进写内容,但结尾 """ 没对齐,导致编译报错 Unexpected character '"""' 或实际字符串开头多出大量空格。
实操建议:
- 把开头
"""放在行首,内容每行左对齐,结尾"""也放行首——最安全,无剪裁歧义 - 若必须缩进(如在 if 块内),确保所有内容行和结尾
"""行使用相同缩进(比如都用 4 个空格),编译器会以结尾行为基准剔除该缩进 - 结尾
"""行不能有其他字符(包括注释),否则无法识别为终止符
示例:
string json = """{
"name": "Alice",
"age": 30
}""";上面的 { 和 "name" 前的 4 个空格会被保留;但如果结尾 """ 前也有 4 个空格,则这 4 个空格会从每一行开头被统一移除。
和 @"" 字符串的关键区别在哪里
两者都避免转义,但行为差异直接影响可读性和维护成本:
-
@""中双引号必须写成"",JSON 或 HTML 片段里引号密集时极易出错;"""内直接写"即可 -
@""不支持跨行(除非手动拼接或加\),"""天然支持多行且语义清晰 -
@""对缩进零处理——你写几格空格就真有几个空格;"""自动剪裁,更贴近“视觉对齐即语义对齐”的直觉 -
@""在 C# 2.0 就存在,"""要求 C# 11+ 且目标框架至少为 .NET 6(含)
典型误用场景:有人试图在 @"" 里写多行 JSON 并靠空格对齐,结果字符串里混入大量不可见空格,解析失败却难以定位。
实际用例中容易忽略的细节
原始字符串不是万能胶,几个关键点常被跳过:
- 不能嵌套
""":想表示连续三个双引号?只能靠拼接,例如""""""(六个引号)会被解释为字符串""" - 插值仍需
$"""形式,且插值表达式里不能含换行(插值部分本身仍是普通表达式) - 正则表达式里用
"""很方便,但别忘了RegexOptions.Multiline等选项仍需显式传入,原始字符串只管字面内容 - IDE(如 VS 2022 17.3+)对
"""有语法高亮和缩进智能匹配,但旧版可能显示异常——确认编辑器支持再大规模采用
最常被漏掉的一点:项目文件里没显式指定 LangVersion,会导致 """ 编译失败却不提示具体原因,错误信息只是模糊的“无法解析”。务必检查 .csproj 是否含 <langversion>11</langversion> 或更高。










