Что делает размещение @ перед именем переменной C#?

Я работал с некоторым унаследованным кодом C# и видел много символов @ перед именами переменных. Что это значит или делает?

В настоящее время я вижу это перед переменными с общими именами, которые не зарезервированы. Например:

MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode);

Учитывая, что этот шаг не является зарезервированным словом, есть ли причина, по которой их следует избегать?

6 ответов

Решение

Это просто способ объявить зарезервированные ключевые слова как переменные.

void Foo(int @string)

Это позволяет вам использовать зарезервированное слово, например "public", в качестве имени переменной.

string @public = "foo";

Я не рекомендовал бы это, поскольку это может привести к ненужной путанице.

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

Из документации:

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

@"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"

Чтобы включить двойную кавычку в строку с @ кавычками, удвойте ее:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

Другое использование символа @ заключается в использовании ссылочных (/reference) идентификаторов, которые являются ключевыми словами C#. Для получения дополнительной информации см. 2.4.2 Идентификаторы.

Знак @ используется с идентификаторами, которые совпадают с ключевыми словами языка. Для этого есть два основных варианта использования - взаимодействие с не-C# кодом. В таких языках, как VB или IronPython, ключевые слова не такие, как в C#, и они могут иметь объявленные классы и свойства с именами, соответствующими ключевым словам C#. Если бы этой функции не было, этот код был бы недоступен в C#. машинный код. Если генератор кода генерирует код на основе какого-либо внешнего источника (например, WSDL), он может просто поставить перед всеми идентификаторами префикс @, а не проверять и преобразовывать идентификаторы, соответствующие ключевым словам C#.

Вы уверены, что ваше дело не второе?

Это экранирует зарезервированные слова в C#.

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

Другие вопросы по тегам