Что такое @ перед строкой в C#?
Это вопрос.NET для C# (или, возможно, VB.net), но я пытаюсь выяснить, в чем разница между следующими объявлениями:
string hello = "hello";
против
string hello_alias = @"hello";
Распечатка на консоли не имеет значения, свойства длины одинаковы.
9 ответов
Он помечает строку как дословный строковый литерал - все, что в строке обычно интерпретируется как escape-последовательность, игнорируется.
Так "C:\\Users\\Rich"
такой же как @"C:\Users\Rich"
Есть одно исключение: для двойной кавычки необходима escape-последовательность. Чтобы избежать двойных кавычек, нужно поместить две двойные кавычки в ряд. Например, @""""
оценивает "
,
Это дословно строковый литерал. Это означает, что экранирование не применяется. Например:
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.";
'@' Также имеет другое значение: размещение его перед объявлением переменной позволяет использовать зарезервированные ключевые слова в качестве имен переменных.
Например:
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 и выглядит неправильно.
Поскольку вы также явно запросили VB, позвольте мне добавить, что этот синтаксис дословной строки не существует в VB, только в C#. Скорее, все строки дословно в VB (за исключением того факта, что они не могут содержать разрывы строк, в отличие от дословных строк C#):
Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""
Последовательности перехода не существуют в VB (за исключением удвоения символа кавычки, как в дословных строках C#), что усложняет некоторые вещи. Например, чтобы написать следующий код в VB, вам нужно использовать конкатенацию (или любой другой способ построения строки)
string x = "Foo\nbar";
В VB это будет написано следующим образом:
Dim x = "Foo" & Environment.NewLine & "bar"
(&
является оператором конкатенации строк VB +
может также использоваться.)
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C# поддерживает две формы строковых литералов: обычные строковые литералы и дословные строковые литералы.
Обычный строковый литерал состоит из нуля или более символов, заключенных в двойные кавычки, как в "hello", и может включать как простые escape-последовательности (например, \ t для символа табуляции), так и шестнадцатеричные и escape-последовательности Unicode.
Строковый литерал состоит из символа @, за которым следует символ двойной кавычки, ноль или более символов и закрывающий символ двойной кавычки. Простой пример - @"привет". В дословном строковом литерале символы между разделителями интерпретируются дословно, единственное исключение составляет кавычка-escape-последовательность. В частности, простые escape-последовательности, а также шестнадцатеричные и Unicode escape-последовательности не обрабатываются в дословных строковых литералах. Строковый литерал может содержать несколько строк.
Это дословная строка, которая изменяет правила экранирования. Единственный символ, который теперь экранируется, это ", экранированный в"". Это особенно полезно для путей к файлам и регулярных выражений:
var path = @"c:\some\location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
так далее
Положить @
перед строкой позволяет использовать специальные символы, такие как обратный слеш или двойные кавычки, без необходимости использования специальных кодов или escape-символов.
Таким образом, вы можете написать:
string path = @"C:\My path\";
вместо:
string path = "C:\\My path\\";
Скопировано из MSDN:
Во время компиляции дословные строки преобразуются в обычные строки с одинаковыми escape-последовательностями. Поэтому, если вы посмотрите дословную строку в окне наблюдения отладчика, вы увидите экранирующие символы, которые были добавлены компилятором, а не дословную версию из вашего исходного кода. Например, дословная строка
@"C:\files.txt"
появится в окне часов как"C:\\files.txt"
,
Объяснение простое. Представлять строку "string\"
нужен компилятор "string\\"
так как \
это побег персонаж Если вы используете @"string\"
вместо этого вы можете забыть о \\
,
Помещение символа "@" перед любой строкой делает ее строковым литералом. Лучшим примером будет
string String1 = "Hello"";
а также
string String2 = @"Hello\"";
Первый из них будет синтаксической ошибкой, в то время как второй напечатает Hello".