这是c#(或可能是VB.net)的.NET问题,但我试图弄清楚以下声明之间的区别:

string hello = "hello";

vs.

string hello_alias = @"hello";

在控制台上打印没有区别,长度属性是相同的。


当前回答

它将字符串标记为逐字串字面值——字符串中任何通常会被解释为转义序列的内容都将被忽略。

所以"C:\\Users\\Rich"和"C:\Users\Rich"是一样的

有一个例外:双引号需要转义序列。要转义双引号,需要在一行中放入两个双引号。例如,@""""的计算结果为“。

其他回答

它将字符串标记为逐字串字面值——字符串中任何通常会被解释为转义序列的内容都将被忽略。

所以"C:\\Users\\Rich"和"C:\Users\Rich"是一样的

有一个例外:双引号需要转义序列。要转义双引号,需要在一行中放入两个双引号。例如,@""""的计算结果为“。

将@放在字符串前面可以使用特殊字符,如反斜杠或双引号,而不必使用特殊代码或转义字符。

所以你可以这样写:

string path = @"C:\My path\";

而不是:

string path = "C:\\My path\\";

“@”还有另一个含义:把它放在变量声明的前面可以让你使用保留的关键字作为变量名。

例如:

string @class = "something";
int @object = 1;

我只发现了一两个合理的用途。主要在ASP。当你想做这样的事情时:

<%= 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标准,只是看起来不正确。

它是一个逐字串字面量。这意味着转义没有被应用。例如:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

这里逐字和逐字具有相同的内容。

它还允许多行内容——这对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.";

原因很简单。为了表示字符串“string\”,编译器需要“string\\”,因为\是一个转义字符。如果你用@"string\"代替,你就可以忘记" \\ "了。