@" "和""" """禁止转义字符串

string str = "";

C#的字符串字面值需要被双引号包裹,表示字符串。如123表示数字,而"123"表示字符串。

字面值的字符分为非转义字符和转义字符。非转义字符表示肉眼可见的字符,如a,b,c,1,2,3,$,* 等,转义字符是肉眼不可见但是有实际含义的字符,如回车,换行,起始,结束等字符,它只能靠 \ + 一个可见的非转义字符组合来表示,如\r表示回车字符,\n表示换行字符,所以,我们能够用可见字符表示所有的可见字符和非可见的转义字符。
但是2个问题:
问题一:如果真的表示\怎么办? \\表示\,假设需要表示\\r(3个字符的字面值),可以用\\\\r
问题二:由于C#编译器认为被双引号包裹的内容才被认为是字符串,如果输入的字符串字面值里面含有双引号,会干扰编译器对字符串起始和结束的判断,所以,字面值的双引号虽然是可见字符,但也要求转义,如"hello",需要写作\"hello\",如果要表示"say\hello\",需要写作\"say\\hello\\\"
至此,所有似乎已经解决。


继续探讨以下场景。

磁盘路径中有大量的\,我们不得不这样写

string path = "D:\\data\\logs\\2025-10-10";

这样比较麻烦,C#提供了语法糖,支持@符号,表示保持字面值是它本身的含义,不对\进行转义解释。

string path = @"D:\data\logs\2025-10-10";

但是@""中包裹的字面值含有"怎么办,因为禁止转义了,不能用\"表示",解决方案是用""表示一个"

string str = @"Dog Say ""Wangwang"".";

使用案例

XML和Json字符串中,含有大量的\,需要全部转义,写起来可读性很差,可以用@禁止转义,只是注意不能再用\"表示",要用""表示".

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
            <root>
                <config name=""Sys.tem"">
                    <config name=""Email"" value=""0X06"" type=""Integer"" />
                    <config name=""Email2"" value=""xuyue@qq.com"" type=""string""  />
                </config>
            </root>";

C# 11(>= .NET6.0)支持更强大的语法""" """,直接把字面值解析成其本身,无需考虑\"

string xml = """
    <?xml version="1.0" encoding="utf-8"?>
    <root>
    	<config name="System">
    		<config name="Emai.l" value="0X06" type="Integer" />
            <config name="Email2" value="xuyue@qq.com" type="string"  />
    	</config>
    </root>
    """;
posted @ 2025-11-02 17:08  ValueLee  阅读(8)  评论(0)    收藏  举报