什么时候在字符串之前使用@更好?

时间:2011-04-30 16:35:09

标签: c# string syntax coding-style prefix

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

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

而不是:

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

我认为这是唯一一个使用@前缀更好的东西,因为你不需要\\,但是当它比仅仅更好时还有其他用途吗?没有它?

5 个答案:

答案 0 :(得分:8)

@符号向编译器指示该字符串是verbatim string literal,因此不要求您转义任何字符。当然,不仅仅是反斜杠。编译器不会处理任何类型的转义序列。

它是否“更好”是一个非常难以回答的问题。这是一种纯粹的风格选择。有些人可能会争辩说,当你使用字符串文字时,字符串内容更多可读,而不是必须转义所有字符。其他人可能更喜欢一致性,其中包含通常需要转义的字符的所有字符串都必须进行转义。这样可以更容易地一目了然地发现代码中的错误。 (对于它的价值,我属于后一阵营。我所有的路径都有\\。)

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

答案 1 :(得分:5)

Windows路径名不是唯一带有大量反斜杠的东西。例如,@ -strings对正则表达式非常有用,因为它们避免了双重转义。

它们也可以跨越多行,所以如果您最终必须在代码中使用多行字符串,它们会使它更方便。

答案 2 :(得分: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";

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

“”和@“”都是字符串文字,第一个是常规文字,但后者是逐字字符串文字 '@' prefix before any string in C# .NET (Regular string literal and Verbatim string literal in C#.NET)