在声明或使用 a 的代码中string
,我通常会看到开发人员这样声明它:
string randomString = @"C:\Random\RandomFolder\ThisFile.xml";
代替:
string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml";
这是我看到的唯一使用@
前缀更好的东西,因为您不需要这样做\\
,但是当它比没有它更好时,还有其他用途吗?
在声明或使用 a 的代码中string
,我通常会看到开发人员这样声明它:
string randomString = @"C:\Random\RandomFolder\ThisFile.xml";
代替:
string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml";
这是我看到的唯一使用@
前缀更好的东西,因为您不需要这样做\\
,但是当它比没有它更好时,还有其他用途吗?
该@
符号向编译器表明该字符串是逐字字符串文字,因此不需要您转义任何字符。当然,不仅仅是反斜杠。编译器不处理任何类型的转义序列。
它是否“更好”是一个非常难以回答的问题。这是一个纯粹的风格选择。有些人可能会争辩说,当您使用字符串文字时,字符串内容更具可读性,而不是必须转义所有字符。其他人可能更喜欢一致性,其中包含通常需要转义的字符的所有字符串都必须被转义。这使得一眼就能更容易地发现代码中的错误。(无论如何,我落入后者阵营。我所有的道路都有\\
。)
话虽如此,它对于正则表达式来说非常方便,否则你会到处逃跑。而且由于它们看起来不像常规字符串,因此混淆的风险很小。
Windows 路径名并不是唯一带有很多反斜杠的东西。例如,@-strings 对于正则表达式非常有用,因为它们避免了对所有内容进行双重转义。
它们也可以跨越多行,所以如果你最终不得不在代码中包含多行字符串,它们会更方便一些。
使正则表达式更简单
@"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";
多行字符串
string s = @"testing
some
string with multiple
lines";
它对于涉及显式匹配反斜杠字符的正则表达式特别有用。由于这是 C# 字符串语法和正则表达式语法中的特殊字符,因此需要“双重转义”。例子:
string regex = "\\\\.*\\.jpg"
使用@-notation 的相同表达式会更整洁:
string regex = @"\\.*\.jpg"
"" 和 @"" 都是字符串文字,首先是常规文字,但后者是 C# .NET 中任何字符串之前的逐字字符串文字 '@' 前缀(C#.NET 中的常规字符串文字和逐字字符串文字)