C#中string前的@是什么?
这是C#(或可能VB.net).NET的问题,但我想弄清楚以下声明之间的区别:
string hello = "hello";
与
string hello_alias = @"hello";
在控制台上打印没有区别,长度属性是相同的。
它将string标记为逐字string文本 – string中通常被解释为转义序列的任何内容都将被忽略。
所以"C:\\Users\\Rich"
和@"C:\Users\Rich"
有一个例外:双引号需要转义序列。 为了避免双引号,你需要在一行中放两个双引号。 例如, @""""
评估为"
。
这是一个逐字string文字 。 这意味着逃避不适用。 例如:
string verbatim = @"foo\bar"; string regular = "foo\\bar";
这里verbatim
和regular
的内容是一样的。
它也允许多行内容 – 对于SQL来说非常方便:
string select = @" SELECT Foo FROM Bar WHERE Name='Baz'";
逐字string文字所需要的一点转义就是得到一个双引号(“),你把它加倍:
string verbatim = @"He said, ""Would you like some coffee?"" and left."; string regular = "He said, \"Would you like some coffee?\" and left.";
“@”还有另一个含义:把它放在variables声明的前面,可以使用保留关键字作为variables名。
例如:
string @class = "something"; int @object = 1;
我只find一个或两个合法的用途。 主要在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>
否则,你将不得不使用“类”,这不是一个保留的关键字,但大写“C”不遵循HTML标准,只是看起来不正确。
既然你明确地要求了VB,那么让我补充一下,这个逐字string语法在VB中不存在,只有在C#中。 相反, 所有的string在VB中是逐字的(除了它们不能包含换行符,不像C#逐字string):
Dim path = "C:\My\Path" Dim message = "She said, ""Hello, beautiful world."""
在VB中不存在转义序列(除了引号字符加倍,就像在C#逐字string中一样),这使得一些事情变得更加复杂。 例如,要在VB中编写以下代码,您需要使用连接(或其他任何方法来构造一个string)
string x = "Foo\nbar";
在VB中,这将写成如下:
Dim x = "Foo" & Environment.NewLine & "bar"
( &
是VBstring连接运算符, +
可以同样使用。)
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C#支持两种forms的string文字:常规string文字和逐字string文字。
常规string文字由零个或多个用双引号引起来的字符组成,如“hello”,并且可能包含简单转义序列(如制表符的\ t)以及hex和Unicode转义序列。
逐字string文字由一个@字符,后跟一个双引号字符,零个或多个字符以及一个双引号字符组成。 一个简单的例子是@“你好”。 在逐字string文字中,分隔符之间的字符是逐字解释的,唯一的例外是一个quote-escape-sequence。 特别是,简单string文字中不处理简单的转义序列和hex和Unicode转义序列。 逐字string文字可能跨越多行。
从MSDN复制:
在编译时,逐字string被转换为普通的string,所有的转义序列都是相同的。 因此,如果您在debugging器观察窗口中查看逐字string,您将看到由编译器添加的转义字符,而不是源代码中的逐字版本。 例如,逐字串
@"C:\files.txt"
将作为"C:\\files.txt"
出现在监视窗口中。
这是一个逐字string,并且改变了转义规则 – 现在被转义的唯一字符是“,转义为”,这对文件path和正则expression式特别有用:
var path = @"c:\some\location"; var tsql = @"SELECT * FROM FOO WHERE Bar = 1"; var escaped = @"a "" b";
等等
在string的前面加上@
可以使用特殊字符(如反斜杠或双引号),而不必使用特殊代码或转义字符。
所以你可以写:
string path = @"C:\My path\";
代替:
string path = "C:\\My path\\";
解释很简单。 为了表示string"string\"
,编译器需要"string\\"
因为\
是一个转义字符。 如果您使用@"string\"
,则可以忘记\\
。
把任何string的“@”作为一个string文字。 一个更好的例子是
string String1 = "Hello"";
和
string String2 = @"Hello"";
第一个将是一个语法错误,第二个将打印出你好“。