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

Чтобы уточнить, у вас есть JAVA_HOME, установленный как системная переменная или установленный в переменные пути класса Eclipse? Я уверен (но не совсем уверен!), Что системная переменная используется компилятором командной строки (и Ant), но Eclipse изменяет эту привязку к используемому JDK

545
задан CodesInChaos 11 January 2012 в 11:33
поделиться

8 ответов

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

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

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

706
ответ дан Richard Everett 11 January 2012 в 22:33
поделиться

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

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.";
243
ответ дан l'L'l 11 January 2012 в 22:33
поделиться

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

, Например:

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 и просто не выглядит правильным.

57
ответ дан JulianR 11 January 2012 в 22:33
поделиться

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

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

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

string x = "Foo\nbar";

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

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

(& оператор объединения строк VB. + мог одинаково использоваться.)

18
ответ дан Konrad Rudolph 11 January 2012 в 22:33
поделиться
  • 1
    Эти sizeof должен быть sizeof(**data) (или просто sizeof(int)); эта ошибка уже была в исходном коде. – Martin B 9 September 2009 в 08:37

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

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

и т.д.

9
ответ дан Jon Skeet 11 January 2012 в 22:33
поделиться

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

, Таким образом, можно записать:

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

вместо:

string path = "C:\\My path\\";
7
ответ дан senshin 11 January 2012 в 22:33
поделиться
  • 1
    Я предполагал столько же...., но Вы никогда не знаете.; ^) – Toad 9 September 2009 в 08:43

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

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

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

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

10
ответ дан Ed Guiness 11 January 2012 в 22:33
поделиться

Скопированный от MSDN:

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

9
ответ дан Joey 11 January 2012 в 22:33
поделиться
  • 1
    Нет, я просто сделал это для упрощения вещей - can' t возвращают его. – a_m0d 9 September 2009 в 08:36
Другие вопросы по тегам:

Похожие вопросы: