Подтвердить что ты не робот

@prefix для идентификаторов в С#

Символ "@" разрешен в качестве префикса для включения ключевых слов в качестве идентификаторов. Об этом знают большинство разработчиков .net.

Но что мы можем не знать: Два идентификатора считаются одинаковыми, если они идентичны после удаления префикса @@.

Итак,

static void Main(string[] args)
{
    int x = 123;
    Console.WriteLine(@x);
}

является абсолютно допустимым кодом и печатает 123 на консоли.

Мне любопытно, почему у нас есть такое правило в спецификациях и как эта функция может использоваться в реальных ситуациях (не имеет смысла префиксные идентификаторы с "@", если они не являются ключевыми словами, верно?).

4b9b3361

Ответ 1

Это абсолютно логично. @ не является частью имени, но является специальным индикатором, чтобы не обрабатывать то, что происходит после ключевого слова, а как идентификатор.

Ответ 2

Эрик Липперт имеет очень хорошее сообщение об этом: Verbatim Identifier

Иногда я спрашивал, почему именно идентификатор может быть стенографический идентификатор. Почему бы не ограничить дословные идентификаторы зарезервированные и контекстные ключевые слова?

Ответ прост. Представьте, что мы вернулись в тот день когда С# 2.0 просто отправлен. У вас есть программа С# 1.0, которая использует урожайность как идентификатор, который является вполне разумным; "доходность" является общей во многих деловых и научных приложениях. Теперь С# 2.0 был тщательно разработан так, чтобы программы С# 1.0, которые использовали выход как идентификатор по-прежнему являются законными программами С# 2.0; у него есть только специальные то есть, когда он появляется перед возвратом, и что никогда не происходило в С# 1.0. Но все же вы решаете, что вы собираетесь отмечать использование урожая в своей программе как стенографические идентификаторы, чтобы более ясным для будущих читателей кода, что он используется как идентификатор, а не как часть итератора

Ответ 3

Рассмотрим пример программы, которая генерирует код C# - например, то, что берет столбцы в таблице базы данных и создает сопоставимый объект C# POCO с одним свойством на столбец.

Что делать, если одно из имен столбцов соответствует ключевому слову C#? Генератору кода не нужно запоминать, какие слова являются ключевыми словами или нет, если all названий свойств с префиксом @.
Это отказоустойчиво. Дополнительные символы @ не повредит код вообще!

Ответ 4

В других ответах довольно ясно, почему такое поведение существует, но я думаю, что было бы полезно посмотреть на правила, для которых идентификаторы считаются равными.

Цитирование раздела спецификации 2.4.2:

Два идентификатора считаются одинаковыми, если они идентичны после применения следующих преобразований, чтобы:

  • Префикс "@", если используется, удаляется
  • Каждая последовательность unicode-escape-последовательности преобразуется в соответствующий символ Unicode.
  • Все символы форматирования удаляются.

Следуя этим правилам, @x идентичен x.

Ответ 5

Он обеспечивает определенность:

  • Использование @word - это будущее.

    Никакие изменения не требуются, если они становятся ключевыми словами позже.
  • Большинство программистов не будут знакомы с каждым ключевым словом (С# содержит около 100 ключевых слов)
  • Более последние ключевые слова являются "контекстуальными", поэтому иногда они не являются ключевыми словами.