4

在声明或使用 a 的代码中string,我通常会看到开发人员这样声明它:

string randomString = @"C:\Random\RandomFolder\ThisFile.xml";

代替:

string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml";

这是我看到的唯一使用@前缀更好的东西,因为您不需要这样做\\,但是当它比没有它更好时,还有其他用途吗?

4

5 回答 5

8

@符号向编译器表明该字符串是逐字字符串文字,因此不需要您转义任何字符。当然,不仅仅是反斜杠。编译器不处理任何类型的转义序列。

它是否“更好”是一个非常难以回答的问题。这是一个纯粹的风格选择。有些人可能会争辩说,当您使用字符串文字时,字符串内容更具可读性,而不是必须转义所有字符。其他人可能更喜欢一致性,其中包含通常需要转义的字符的所有字符串都必须被转义。这使得一眼就能更容易地发现代码中的错误。(无论如何,我落入后者阵营。我所有的道路都有\\。)

话虽如此,它对于正则表达式来说非常方便,否则你会到处逃跑。而且由于它们看起来不像常规字符串,因此混淆的风险很小。

于 2011-04-30T16:39:47.720 回答
5

Windows 路径名并不是唯一带有很多反斜杠的东西。例如,@-strings 对于正则表达式非常有用,因为它们避免了对所有内容进行双重转义。

它们也可以跨越多行,所以如果你最终不得不在代码中包含多行字符串,它们会更方便一些。

于 2011-04-30T16:38:04.007 回答
1

使正则表达式更简单

@"^(([\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";
于 2011-04-30T16:39:38.777 回答
1

它对于涉及显式匹配反斜杠字符的正则表达式特别有用。由于这是 C# 字符串语法和正则表达式语法中的特殊字符,因此需要“双重转义”。例子:

string regex = "\\\\.*\\.jpg"

使用@-notation 的相同表达式会更整洁:

string regex = @"\\.*\.jpg"
于 2011-04-30T16:41:15.380 回答
0

"" 和 @"" 都是字符串文字,首先是常规文字,但后者是 C# .NET 中任何字符串之前的逐字字符串文字 '@' 前缀(C#.NET 中的常规字符串文字和逐字字符串文字)

于 2013-10-16T10:10:10.260 回答