我注意到这段代码:
FileInfo[] files =new DirectoryInfo(@"C:\").GetFiles();
@
的目的是什么?还有其他用途吗?
答案 0 :(得分:21)
C#支持两种形式的字符串文字:常规字符串文字和逐字字符串文字。
常规字符串文字由用双引号括起来的零个或多个字符组成,如“hello”中所示,并且可能包含简单的转义序列(例如用于制表符的\ t)和十六进制和Unicode转义序列。
逐字字符串文字由@字符后跟双引号字符,零个或多个字符以及结束双引号字符组成。一个简单的例子就是@“你好”。在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是quote-escape-sequence。特别是,简单的转义序列和十六进制和Unicode转义序列不会在逐字字符串文字中处理。逐字字符串文字可以跨越多行。
示例1:
@"C:\Path\File.zip" == "C:\\Path\\File.zip"
// where
"C:\\Path\\File.zip" // regular string literal
@"C:\Path\File.zip" // verbatim string literal
注意:在逐字字符串文字中,您应该转义双引号。
示例2:
@"He said: ""Hello""" == "He said: \"Hello\""
此处有更多信息:
前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许使用@前缀作为非关键字的标识符,但强烈建议不要使用样式。
示例:强>
class @class
{
public static void @static(bool @bool) {
if (@bool)
System.Console.WriteLine("true");
else
System.Console.WriteLine("false");
}
}
class Class1
{
static void M() {
cl\u0061ss.st\u0061tic(true);
}
}
答案 1 :(得分:7)
@
符号在C#中有几个含义:
在字符串的开头使用时,表示“从字面上理解这个字符串;不要解释本来可以用作转义字符的字符”。这称为 verbatim string literal 。例如,@"\n\t"
等于"\\n\\t"
。
在标识符的开头使用时,表示“将其解释为标识符,而不是关键字”。例如,int @this
允许您将整数变量命名为“this”,这通常是非法的,因为this
是关键字。
答案 2 :(得分:2)
@符号基本上表示“完全按照原样使用此字符串”。它允许开发人员避免转义。
所以,@“C:\”==“C:\\”(使用\转义)。
我发现它在RegEx中最有用......当你开始转义不同的东西等时,RegEx会变得非常讨厌和混乱,所以只使用文字值很好。
答案 3 :(得分:2)
那是verbatim string literal所以你可以使用反斜杠而不被解释为转义字符。
逐字字符串文字由 一个
@
字符后跟一个 双引号字符,零或更多 字符和结束双引号 字符。一个简单的例子是@"hello"
。在逐字字符串中 字面意思,字面之间的字符 分隔符是逐字解释的, 唯一的例外是a 报价转义序列。特别是, 简单的逃逸序列和 十六进制和Unicode转义 不处理序列 逐字字符串文字。一字不差 字符串文字可能跨越多个 线。
quote-escape-sequence:""
因此,唯一逃避逐字字符串文字的做法是将""
转换为"
在两个人的范围内。
答案 4 :(得分:1)
字符串前面的@符号允许字符串的字面解释,否则你必须用另一个字符串(“C:\”)来反转斜杠。
答案 5 :(得分:1)
@表示该字符串是文字字符串,因此您不必转义其中的字符。正如documentation for string所说:
逐字字符串的优点是不处理转义序列,这使得它易于编写,例如,完全限定的文件名:@“c:\ Docs \ Source \ a.txt”而不是{{1 }}
答案 6 :(得分:1)
在字符串之前放置一个@,将它从常规文字字符串转换为不使用正斜杠转义()的逐字文字字符串,但在一行中使用两个引号来转义引号。