What is the significance of the @ symbol in C sharp?
Possible Duplicate:
What's the @ in front of a string for .NET?
我理解使用
但是,我有以下行作为将文件存储到映射网络驱动器的路径:
上面的操作很好,但现在我想从命令行中获取一个字符串,因此我已经完成了以下操作:
上面的内容不起作用,似乎我的斜线也没有被忽略。这是我的命令:
我如何才能恢复
它有两种用途:
- 创建"逐字"字符串(忽略转义符):
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 +"\"; |
转义变量名(例如使用关键字作为参数名)
私有静态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 + @"\"; |
@符号仅与代码中的字符串文本相关。变量不应修改字符串的内容。