C符号中@符号的意义是什么?

时间:2011-06-20 15:41:24

标签: c# escaping

  

可能重复:
  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\\"

如何才能获得@符号的效果?

10 个答案:

答案 0 :(得分:10)

它用于两件事:

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

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

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

答案 1 :(得分:2)

@前缀表示字符串是文字字符串,编译器不执行转义字符处理,因此:

@"\n"

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

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

看起来有点凌乱。 '@'整理了一些东西。 '@'只能以字符串常量为前缀,即一对双引号(“)中的内容。由于它是一个编译器指令,它只在编译时应用,所以字符串必须在编译时知道,因此,

@some_string_var

不符合您的想法。但是,由于所有'@'都是由编译器停止处理转义字符,因此变量中的字符串已经包含转义的字符值('\ n'为10,13等)。如果你想在运行时将'\ n'转换为10,13,你需要自己解析它做必要的替换(但我相信有人知道更好的方法)。

为了得到你想要的,做:

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

答案 2 :(得分:2)

字符串文字前面的 @ 符号告诉编译器忽略和转义字符串中的序列(即以斜杠开头的东西)并只是创建字符串“as-is”

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

int @class=10;

如果你没有为@添加前缀,那么你会得到一个编译时错误。

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

int @foo=22;

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

答案 3 :(得分:1)

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

@"good morning"  // a string literal

@ -quoting的优点是不处理转义序列,这使得它易于编写,例如,完全限定的文件名:

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

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

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

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

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

答案 4 :(得分:1)

在这种情况下,您可能不需要使用@;只是做到了

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

答案 5 :(得分:1)

@符号在C#中有两种用途。

  1. 使用引号而不是转义。 “\ windows”可以表示为@“\ windows”。 “\”John!\“”可以代表@“”“John!”“”。
  2. 转义变量名称(例如使用关键字作为参数名称)

    private static void InsertSafe(string item,object @lock)  {     锁(@lock)     {       mylist.Insert(0,项);     }  }

答案 6 :(得分:0)

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

答案 7 :(得分:0)

@符号在引号前面。它只适用于字符串文字,它只是改变了编译器理解字符串的方式。它的主要功能是将\解释为文字反斜杠,而不是转义下一个字符。所以你想要:

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

答案 8 :(得分:0)

默认情况下,'\'字符是C#中字符串的转义字符。这意味着如果你想在你的字符串中有一个反斜杠你需要两个斜杠,第一个转义第二个,如下所示:

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

更容易遵循的一个例子是使用引号:

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

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

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

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

在声明字符串时,只需要使用@符号。由于你的论证已经宣布,因此不需要。所以你的新行可以是:

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

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

答案 9 :(得分:0)

如果从命令行加载,它将已经为您转义。这就是为什么你的逃生从你的角度被“忽略”了。请注意,从config加载时也是如此,所以不要这样做:

<add key="pathToFile" value="C:\\myDirectory\\myFile.txt"/>

如果你这样做,你最终得到双字符串,因为“.NET”足够智能,当你以这种方式加载时,它们可以为你逃脱。