关于C#:C夏普中@符号的意义是什么?

What is the significance of the @ symbol in C sharp?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What's the @ in front of a string for .NET?

我理解使用@符号就像字符串的转义符。

但是,我有以下行作为将文件存储到映射网络驱动器的路径:

String location = @"\\192.168.2.10\datastore\\" + id +"\\";

上面的操作很好,但现在我想从命令行中获取一个字符串,因此我已经完成了以下操作:

String location = @args[0] + id +"\\";

上面的内容不起作用,似乎我的斜线也没有被忽略。这是我的命令:

MyProgram.exe"\\192.168.2.10\datastore\\"

我如何才能恢复@符号的效果?


它有两种用途:

  • 创建"逐字"字符串(忽略转义符):string path = @"C:\Windows"
  • 转义语言关键字用作标识符:string @class ="foo"

在您的情况下,您需要这样做:

1
String location = args[0] + id + @"\";


字符串文字前面的@符号告诉编译器忽略和转义字符串中的序列(即以斜杠开头的内容),并只创建字符串"原样"。

它还可以用于创建名称为保留工作的变量。例如:

1
int @class=10;

如果不给@加前缀,则会出现编译时错误。

您还可以将其前缀设置为非保留字的变量:

1
int @foo=22;

注意,您可以在代码中将变量称为foo或@foo。


@prefix意味着字符串是文本字符串,编译器不执行转义字符的处理,因此:

1
2
@"
"

未转换为换行符。如果没有它,你会有:

1
String location ="\\\\192.168.2.10\\datastore\\\" + id +"\\\";

看起来有点乱。"@"把事情整理了一下。"@"只能作为字符串常量的前缀,即双引号(")内的内容。因为它是一个编译器指令,所以只在编译时应用,所以字符串必须在编译时已知,因此,

1
@some_string_var

不是你想的那样。但是,由于编译器停止对转义字符的处理,因此变量中的字符串中已经包含转义字符值(10,13表示''等)。例如,如果您想在运行时将''转换为10,13,您需要自己分析它,进行所需的替换(但我确信有人知道更好的方法)。

要获得您想要的,请执行以下操作:

1
String location = args[0] + id +"\";

@符号在c_中有两种用途。

  • 使用引号而不是转义。" Windows"可以表示为@Windows"。约翰!"可以代表@"约翰!".
  • 转义变量名(例如使用关键字作为参数名)

    私有静态void insertsafe(字符串项,object@lock){锁(@锁){mylist.insert(0,项);}}


  • 在这种情况下,您可能不需要使用@;只需使它

    1
    String location = args[0] + id +"\";

    @-带引号的字符串文本以@开头,并用双引号括起来。例如:

    1
    @"good morning"  // a string literal

    @-引号的优点是不处理转义序列,这使得写入完全限定的文件名变得容易,例如:

    1
    @"c:\Docs\Source\a.txt"  // rather than"c:\\Docs\\Source\\a.txt"

    若要在@引号字符串中包含双引号,请将其加倍:

    1
    @"""Ahoy!"" cried the captain." //"Ahoy!" cried the captain.

    @符号的另一个用法是使用引用的(/reference)标识符,这些标识符恰好是C关键字。有关更多信息,请参见2.4.2标识符。

    http://msdn.microsoft.com/en-us/library/362314fe(v=vs.71).aspx


    如果从命令行加载,它将已经为您转义。这就是为什么你的逃犯从你的角度被"忽视"的原因。请注意,从配置加载时也是如此,因此不要这样做:

    1
     

    如果你这样做了,你最终会得到双字符串,因为".net"足够聪明,当你以这种方式加载它们时,它可以为你转义一些东西。


    默认情况下,""字符是C中字符串的转义字符。这意味着,如果要在字符串中使用反斜杠,则需要两个斜杠,第一个斜杠用于转义第二个斜杠,如下所示:

    1
    2
    string escaped ="This is a backslash \";
    //The value of escaped is - This is a backslash \

    下面一个简单的例子是使用引号:

    1
    2
    string escaped ="To put a " in a string you need to escape it";
    //The value of escaped is - To put a"
    in a string you need to escape it

    @符号相当于"忽略此字符串中的所有转义字符",并逐字声明。如果没有它,您的第一个声明将如下所示:

    1
    "\\\\192.168.2.10\\datastore\\\" + id +"\";

    请注意,您的第二个字符串上已经没有@,所以该字符串没有更改,仍然只包含一个反斜杠。

    只有在声明字符串时才需要使用@符号。因为你的论点已经声明了,所以不需要。所以你的新品可以是:

    1
    String location = args[0] + id +"\";

    1
    String location = args[0] + id + @"";

    @符号正好在引号之前。它只在字符串文本上工作,并且只改变编译器理解字符串的方式。它所做的主要工作是使\被解释为字面反斜杠,而不是转义下一个字符。所以你想要:

    1
    String location = args[0] + id + @"\";


    @符号仅与代码中的字符串文本相关。变量不应修改字符串的内容。