Что такое @ перед строкой в C #?

479

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

string hello = "hello";

против.

string hello_alias = @"hello";

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

Теги:
string

10 ответов

570
Лучший ответ

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

Итак, "C:\\Users\\Rich" совпадает с @"C:\Users\Rich"

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

  • 1
    @RichardEverett Я понял ответ, но я сомневаюсь, что на самом деле используется эта функция?
  • 16
    @Arun Это действительно полезно при работе со строками, содержащими такие вещи, как определения регулярных выражений, которые часто нуждаются в экранировании самих себя.
Показать ещё 5 комментариев
211

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

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.";
  • 13
    Это также позволяет использовать зарезервированные слова как имена переменных и прочее. Как public int GetValueOrDefault (int @default);
  • 5
    Свиш: Верно, но не имеет отношения к этому конкретному вопросу.
Показать ещё 1 комментарий
46

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

Например:

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>

В противном случае вам придется использовать "класс", который не является зарезервированным ключевым словом, а верхний регистр "C" не соответствует стандартам HTML и просто выглядит не так.

  • 6
    правильно, но не просили
13

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

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

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

string x = "Foo\nbar";

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

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

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

  • 1
    О боже, это звучит раздражающе ... еще больше рад, что я сейчас использую C #: p
  • 0
    Вы не можете вставлять разрывы строк в строковые литералы VB, даже если вы можете в дословные строковые литералы C #. Таким образом, они не одинаковы.
Показать ещё 8 комментариев
8

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

С# поддерживает две формы строковых литералов: регулярные строковые литералы и стенографические литералы.

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

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

7

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

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

  • 0
    Это типичный вводящий в заблуждение фрагмент документации Microsoft, ИМХО! То, что выше указано в качестве конечного результата, является правильным, но основная истина заключается в том, что строки в C # преобразуются в соответствующую последовательность байтов (или многобайтовые коды символов). C # допускает два разных способа представления базовой строки, с @ "..." или "...". Отладчик всегда выбирает путь «...» и не может определить, какой из них использовался в первую очередь. (Последовательности Escape, такие как \ n или "", относятся только к программированию и отображению строкового представления уровня и никогда не сохраняются в базовой строке!)
6

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

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

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

вместо:

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

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

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

и т.д.

  • 0
    Разве вы не пропустили @ в вашем примере, Марк? Или это по умолчанию, когда я использую var? Немного смущен ...
  • 1
    Марк просто подражал моим предыдущим ошибкам :)
Показать ещё 3 комментария
2

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

-4

Чтобы поставить "@" infront любой строки, это будет строковый литерал. Лучшим примером будет

string String1 = "Hello"";

а также

string String2 = @"Hello\"";

Первая из них будет синтаксической ошибкой, когда вторая будет печатать Hello ".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню