升C中@符号的意义是啥? [复制]
Posted
技术标签:
【中文标题】升C中@符号的意义是啥? [复制]【英文标题】:What is the significance of the @ symbol in C sharp? [duplicate]升C中@符号的意义是什么? [复制] 【发布时间】:2011-09-18 19:43:22 【问题描述】:可能重复: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\\"
我怎样才能恢复@
符号的效果?
【问题讨论】:
你为什么要在你的命令末尾加上两个反斜杠?这不是 C# 语句在做什么。 【参考方案1】:它用于两件事:
创建“逐字”字符串(忽略转义字符):string path = @"C:\Windows"
转义语言关键字以将它们用作标识符:string @class = "foo"
在您的情况下,您需要这样做:
String location = args[0] + id + @"\\";
【讨论】:
实际上他根本不想要@。第二个字符串在原始版本中没有,因此解析为只有一个反斜杠。【参考方案2】:字符串文字前面的 @ 符号告诉编译器忽略和转义字符串中的序列(即以斜杠开头的内容)并“按原样”创建字符串
它也可用于创建名称为保留作品的变量。例如:
int @class=10;
如果你不给 @ 加前缀,那么你会得到一个编译时错误。
你也可以给非保留字的变量添加前缀:
int @foo=22;
请注意,您可以在代码中将变量称为 foo 或 @foo。
【讨论】:
【参考方案3】:@前缀表示字符串是文字字符串,转义字符的处理不是由编译器进行的,所以:
@"\n"
不转换为换行符。没有它,您将拥有:
String location = "\\\\192.168.2.10\\datastore\\\\" + id + "\\\\";
看起来有点乱。 '@' 整理了一下。 '@' 只能作为字符串常量的前缀,即双引号 (") 内的内容。由于它是编译器指令,它仅在编译时应用,因此必须在编译时知道字符串,因此,
@some_string_var
不像你想的那样工作。但是,由于所有 '@' 所做的只是停止编译器对转义字符的处理,因此变量中的字符串中已经包含转义字符值('\n' 为 10,13,等等)。例如,如果您想在运行时将 '\n' 转换为 10,13,您需要自己解析它并进行所需的替换(但我相信有人知道更好的方法)。
要得到你想要的,做:
String location = args[0] + id + "\\";
【讨论】:
【参考方案4】:@
符号在 C# 中有两种用途。
-
使用引号而不是转义。 "\windows" 可以表示为@"\windows"。 "\"John!\"" 可以表示为@"""John!"""。
转义变量名(例如使用关键字作为参数名)
private static void InsertSafe(字符串项,对象@lock) 锁 (@lock) mylist.Insert(0,item);
【讨论】:
【参考方案5】:@ 引用的字符串文字以 @ 开头并用双引号括起来。例如:
@"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
【讨论】:
【参考方案6】:在这种情况下,您可能不需要使用@;做吧
String location = args[0] + id + "\\";
【讨论】:
【参考方案7】:@ 符号仅与代码中的字符串文字相关。变量不应该修改字符串的内容。
【讨论】:
【参考方案8】:@ 符号就在引号之前。它只适用于字符串文字,它只是改变了编译器理解字符串的方式。它所做的主要事情是导致\
被解释为文字反斜杠,而不是转义下一个字符。所以你想要:
String location = args[0] + id + @"\\";
【讨论】:
你比我早了大约 1 秒!删除了我的答案,所以我不会重复它。 :)【参考方案9】:默认情况下,'\' 字符是 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 + @"\";
【讨论】:
【参考方案10】:如果您从命令行加载,它已经为您转义了。这就是为什么从你的角度来看你的逃跑被“忽略”了。请注意,从配置加载时也是如此,所以不要这样做:
<add key="pathToFile" value="C:\\myDirectory\\myFile.txt"/>
如果这样做,您最终会得到双字符串,因为“.NET”足够聪明,可以在您以这种方式加载它们时为您避开细线。
【讨论】:
以上是关于升C中@符号的意义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章