Avatar ·

Что означает символ @ перед строкой в C#?

Всем привет! Я начал изучать C# и наткнулся на странную конструкцию в чужом коде. Вот пример: ```csharp string path = @"C:\Users\Admin\Documents\file.txt"; string text = @"Hello, world!"; ``` Я вижу, что перед строкой стоит символ @. Что он делает? Без него код не работает? Я попробовал убрать @ из первой строки, и Visual Studio выдала ошибку про "unrecognized escape sequence". Но во второй строке, если убрать @, код вроде работает, но строка выводится в одну строчку, а не в две. Объясните, пожалуйста, зачем нужен этот символ и когда его использовать. Мне кажется, это какая-то магия, которая мешает понять, как работают строки в C#. Заранее спасибо! P.S. Еще видел, что @ используют перед именами переменных, например `string @class = "test";`. Это то же самое или нет? <<>>

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

Символ @ перед строкой создает буквальную строку (verbatim string literal). Это специальный синтаксис, который меняет правила обработки строки компилятором. Давайте разберем на примерах.

Основное назначение: отмена экранирования

В обычных строках обратная косая черта \ используется для escape-последовательностей:

string normal = "C:\\Users\\Admin"; // Двойной слеш для одного
string withTab = "Hello\tWorld";    // \t - символ табуляции

С @ все обратные слеши считаются обычными символами:

string verbatim = @"C:\Users\Admin"; // Один слеш, всё работает
string verbatim2 = @"Hello\tWorld";  // Выведет буквально "Hello\tWorld"

Многострочные строки

Буквальные строки сохраняют переносы строк прямо в коде:

string multiline = @"Первая строка
Вторая строка
Третья строка";

Обычная строка так не работает — перенос нужно делать через \n или конкатенацию.

Как экранировать кавычки в буквальных строках?

Единственный символ, который нужно экранировать — это двойная кавычка. Для этого используется удвоение:

string quote = @"Он сказал: ""Привет"""; // Результат: Он сказал: "Привет"

Когда использовать @?

  • Пути к файлам — избавляет от дубляжа слешей: @"C:\Folder\File.txt"
  • Регулярные выражения — в них много обратных слешей: @"\d+\.\d+"
  • SQL-запросы — многострочные запросы становятся читаемыми
  • JSON или XML — когда нужно вставить большой блок текста

Важное отличие: @ для идентификаторов

Вы упомянули @class. Это другая возможность — использование зарезервированных слов как имен переменных:

string @class = "C#";  // class - ключевое слово, но с @ можно
int @int = 5;          // Так тоже можно, но лучше избегать

Это не связано с буквальными строками — просто синтаксический сахар для обратной совместимости.

Производительность

Буквальные строки не создают накладных расходов во время выполнения — компилятор обрабатывает их на этапе компиляции. Единственное отличие: в IL-коде escape-последовательности разворачиваются в фактические символы.

Итог

  • @ перед строкой = "воспринимай всё буквально"
  • Обратные слеши не экранируются
  • Переносы строк сохраняются
  • Кавычки экранируются удвоением ("")
  • Не путать с @ перед идентификаторами

Используйте буквальные строки везде, где много обратных слешей или нужны многострочные тексты — это делает код чище и понятнее.

<<>>

Альтернативный взгляд: когда @ не нужен

Несмотря на удобство, буквальные строки имеют ограничения. В современных версиях C# (начиная с 11) появились сырые строковые литералы (raw string literals) — три двойные кавычки """:

string raw = """"
C:\Users\Admin
Многострочный текст
с "кавычками" внутри
"""";

Они еще удобнее для сложных многострочных блоков — не нужно удваивать кавычки. Но для простых путей и регулярных выражений классический @ остается лучшим выбором.

Совет для новичков

Если вы часто работаете с путями в Windows, привыкайте использовать @ — это спасет от глупых ошибок. Для кроссплатформенного кода лучше использовать Path.Combine() или / (слеш работает и в Windows):

string path = Path.Combine("C:", "Users", "Admin");
string path2 = "C:/Users/Admin"; // Тоже работает в .NET

Но если вам нужно именно сохранить обратные слеши — @ незаменим.