C#中'@'的所有用法是什么?

时间:2009-04-12 20:24:22

标签: c# .net

我注意到这段代码:

 FileInfo[] files =new DirectoryInfo(@"C:\").GetFiles();

@的目的是什么?还有其他用途吗?

7 个答案:

答案 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)

在字符串之前放置一个@,将它从常规文字字符串转换为不使用正斜杠转义()的逐字文字字符串,但在一行中使用两个引号来转义引号。

Jon Skeet writes more about strings in C#/.NET.