这是C#(或可能是VB.net)的.NET问题,但我试图找出以下声明之间的区别:
string hello = "hello";
VS。
string hello_alias = @"hello";
在控制台上打印没有区别,长度属性是相同的。
答案 0 :(得分:673)
它将字符串标记为verbatim string literal - 字符串中通常被解释为escape sequence的任何内容都将被忽略。
因此"C:\\Users\\Rich"
与@"C:\Users\Rich"
有一个例外:双引号需要转义序列。要逃避双引号,您需要连续放两个双引号。例如,@""""
评估为"
。
答案 1 :(得分:228)
这是逐字字符串文字。这意味着不应用转义。例如:
string verbatim = @"foo\bar";
string regular = "foo\\bar";
此处verbatim
和regular
具有相同的内容。
它还允许多行内容 - 这对SQL来说非常方便:
string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";
逐字字符串文字所必需的一点转义是获得双引号(“),你可以通过加倍来实现:
string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";
答案 2 :(得分:52)
'@'也有另一个含义:将它放在变量声明前面允许你使用保留关键字作为变量名。
例如:
string @class = "something";
int @object = 1;
我只发现了一两个合法用途。主要在ASP.NET MVC中,当你想做这样的事情时:
<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>
哪会产生如下的HTML链接:
<a href="/Controller/Action" class="some_css_class">Text</a>
否则你必须使用'Class',它不是保留的关键字,但是大写的'C'不符合HTML标准,只是看起来不正确。
答案 3 :(得分:18)
由于您也明确要求使用VB,所以我要补充一点,这个逐字字符串语法在VB中不存在,仅在C#中存在。相反,所有字符串在VB中是逐字的(除了它们不能包含换行符,与C#逐字字符串不同):
Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""
VB中不存在转义序列(除了引号字符的加倍,比如在C#逐字字符串中),这使得一些事情变得更复杂。例如,要在VB中编写以下代码,您需要使用串联(或任何其他构造字符串的方法)
string x = "Foo\nbar";
在VB中,这将写成如下:
Dim x = "Foo" & Environment.NewLine & "bar"
(&
是VB字符串连接运算符。同样可以使用+
。)
答案 4 :(得分:10)
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C#支持两种形式的字符串文字:常规字符串文字和逐字字符串文字。
常规字符串文字由用双引号括起来的零个或多个字符组成,如“hello”中所示,并且可以包括简单转义序列(例如用于制表符的\ t)和十六进制和Unicode转义序列。
逐字字符串文字由@字符后跟双引号字符,零个或多个字符以及结束双引号字符组成。一个简单的例子就是@“你好”。在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是quote-escape-sequence。特别是,简单的转义序列和十六进制和Unicode转义序列不会在逐字字符串文字中处理。逐字字符串文字可以跨越多行。
答案 5 :(得分:9)
这是一个逐字字符串,并更改了转义规则 - 现在转义的唯一字符是“,转义为”“。这对文件路径和正则表达式特别有用:
var path = @"c:\some\location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
等
答案 6 :(得分:9)
从MSDN复制:
在编译时,逐字字符串将转换为具有所有相同转义序列的普通字符串。因此,如果在调试器监视窗口中查看逐字字符串,您将看到编译器添加的转义字符,而不是源代码中的逐字字符。例如,逐字字符串
@"C:\files.txt"
将在观察窗口中显示为"C:\\files.txt"
。
答案 7 :(得分:7)
将@
放在字符串前面使您可以使用特殊字符,例如反斜杠或双引号,而无需使用特殊代码或转义字符。
所以你可以写:
string path = @"C:\My path\";
而不是:
string path = "C:\\My path\\";
答案 8 :(得分:3)
解释很简单。要表示字符串"string\"
,编译器需要"string\\"
,因为\
是转义字符。如果您使用@"string\"
,则可以忘记\\
。