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

本文关键字:更好 字符串 什么时候 | 更新日期: 2023-09-27 17:54:11

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

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

代替:

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

这是我唯一看到的使用@前缀更好的事情,因为你不需要做'',但是当它比没有它更好的时候,它还有其他用途吗?

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

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

是否"更好"是一个极难回答的问题。这纯粹是文体上的选择。有些人可能会争辩说,当您使用字符串文字而不是转义所有字符时,字符串内容更可读。其他人可能更喜欢一致性,其中所有包含通常需要转义的字符的字符串都必须转义。这使得一眼就能发现代码中的错误变得更加容易。不管怎样,我属于后者。我所有的路径都有''

话虽这么说,对于正则表达式来说,非常方便,否则您将到处转义。因为它们看起来不太像普通字符串,所以混淆的风险最小。

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

它们也可以跨越多行,所以如果你最终不得不在你的代码中有多行字符串,它们使它更方便。

简化正则表达式

@"^((['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"

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

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

"和@"都是字符串字面值,前者是常规字面值,后者是逐字面值c# .NET中任何字符串前的'@'前缀(c# .NET中的常规字符串文字和逐字字符串文字)