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"; 

这里verbatimregular的内容是一样的。

它也允许多行内容 – 对于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""; 

第一个将是一个语法错误,第二个将打印出你好“。