在声明或使用string
的代码中,我通常会看到开发人员声明它是这样的:
string randomString = @"C:\Random\RandomFolder\ThisFile.xml";
而不是:
string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml";
我认为这是唯一一个使用@
前缀更好的东西,因为你不需要\\
,但是当它比仅仅更好时还有其他用途吗?没有它?
答案 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)