Что такое @ перед строкой в ​​C #? - PullRequest
535 голосов
/ 17 февраля 2009

Это вопрос .NET для C # (или, возможно, VB.net), но я пытаюсь выяснить, в чем разница между следующими объявлениями:

string hello = "hello";

против.

string hello_alias = @"hello";

Распечатка на консоли не имеет значения, свойства длины одинаковы.

Ответы [ 9 ]

675 голосов
/ 17 февраля 2009

Он помечает строку как дословный строковый литерал - все, что в строке обычно интерпретируется как escape-последовательность , игнорируется.

То есть "C:\\Users\\Rich" совпадает с @"C:\Users\Rich"

Есть одно исключение: для двойной кавычки необходима escape-последовательность. Чтобы избежать двойных кавычек, нужно поместить две двойные кавычки в ряд. Например, @"""" оценивается как ".

231 голосов
/ 17 февраля 2009

Это дословный строковый литерал . Это означает, что экранирование не применяется. Например:

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.";
52 голосов
/ 17 февраля 2009

'@' также имеет другое значение: размещение его перед объявлением переменной позволяет вам использовать зарезервированные ключевые слова в качестве имен переменных.

Например:

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>

В противном случае вам пришлось бы использовать «Класс», который не является зарезервированным ключевым словом, но заглавная буква «С» не соответствует стандартам HTML и выглядит неправильно

18 голосов
/ 17 февраля 2009

Поскольку вы также явно запросили VB, позвольте мне добавить, что этот синтаксис дословной строки не существует в VB, только в C #. Скорее, все строки дословно представлены в VB (за исключением того факта, что они не могут содержать разрывы строк, в отличие от дословных строк C #):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

В VB не существует escape-последовательностей (за исключением удвоения символа кавычки, как в дословных строках C #), что усложняет некоторые вещи. Например, чтобы написать следующий код в VB, вам нужно использовать конкатенацию (или любой другой способ построения строки)

string x = "Foo\nbar";

В VB это будет записано следующим образом:

Dim x = "Foo" & Environment.NewLine & "bar"

(& - оператор конкатенации строк VB. + также может использоваться.)

10 голосов
/ 17 февраля 2009

http://msdn.microsoft.com/en-us/library/aa691090.aspx

C # поддерживает две формы строковых литералов: обычные строковые литералы и дословные строковые литералы.

Обычный строковый литерал состоит из нуля или более символов, заключенных в двойные кавычки, как в «привет», и может включать как простые escape-последовательности (например, \ t для символа табуляции), так и шестнадцатеричные и escape-последовательности Unicode.

Строковый литерал состоит из символа @, за которым следует символ двойной кавычки, ноль или более символов и закрывающий символ двойной кавычки. Простой пример - @ "привет". В дословном строковом литерале символы между разделителями интерпретируются дословно, единственное исключение составляет кавычка-escape-последовательность. В частности, простые escape-последовательности, а также шестнадцатеричные и Unicode escape-последовательности не обрабатываются в дословных строковых литералах. Строковый литерал может содержать несколько строк.

9 голосов
/ 17 февраля 2009

Скопировано с MSDN :

Во время компиляции дословные строки преобразуются в обычные строки с одинаковыми escape-последовательностями. Поэтому, если вы посмотрите дословную строку в окне наблюдения отладчика, вы увидите escape-символы, которые были добавлены компилятором, а не дословную версию из вашего исходного кода. Например, дословная строка @"C:\files.txt" появится в окне просмотра как "C:\\files.txt".

9 голосов
/ 17 февраля 2009

Это дословная строка, которая изменяет правила экранирования. Единственный символ, который теперь экранируется, это ", экранированный в" ". Это особенно полезно для путей к файлам и регулярного выражения:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

и т.д.

7 голосов
/ 17 февраля 2009

Помещение @ перед строкой позволяет использовать специальные символы, такие как обратную косую черту или двойные кавычки, без необходимости использования специальных кодов или escape-символов.

Итак, вы можете написать:

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

вместо:

string path = "C:\\My path\\";
3 голосов
/ 08 декабря 2015

Объяснение простое. Для представления строки "string\" компилятору требуется "string\\", поскольку \ является escape-символом. Если вместо этого вы используете @"string\", вы можете забыть о \\.

...