Каково использование / значение символа @ в именах переменных в C#?

Я обнаружил, что вы можете начинать имя переменной с символа '@' в C#. В моем проекте c# я использовал веб-службу (я добавил веб-ссылку на свой проект), которая была написана на Java. Один из объектов, интерфейса, определенных в WSDL имеет переменную-член с именем "params". Очевидно, что это зарезервированное слово в C#, поэтому вы не можете иметь класс с переменной-членом с именем "params". Созданный прокси-объект содержал свойство, которое выглядело следующим образом это:

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

Я просмотрел документацию VS 2008 c#, но ничего не смог найти об этом. Также поиск в Google не дал мне полезные ответы. Итак, каково точное значение или использование символа " @ " в имени переменной/свойства?

9 ответов


прямиком из Спецификация Языка C#, Идентификаторы (C#) :

префикс "@" позволяет использовать ключевые слова как идентификаторы полезно при взаимодействии с другими алгоритмический язык. Характер @ на самом деле не часть идентификатор, поэтому идентификатор может быть видел в других языках как обычный идентификатор, без префикса. - вызывается идентификатор с префиксом @ стенограмма идентификатор.


Это просто позволяет использовать зарезервированное слово в качестве имени переменной. Не рекомендуется IMHO (за исключением случаев, когда у вас есть).


в C# символ at ( @ ) используется для обозначения литералов, которые явно не соответствуют соответствующим правилам в спецификации языка.

в частности, он может использоваться для имен переменных, которые сталкиваются с зарезервированными ключевыми словами (например, вы не можете использовать params, но вы можете использовать @params вместо этого, то же самое с out/ref/любым другим ключевым словом в спецификации языка). Кроме того, он может использоваться для неэскапированных строковых литералов; это особенно актуально для констант пути, например, вместо path = "c:\temp\somefile.txt" можно писать path = @"c:\temp\somefile.txt". Это также очень полезно для регулярных выражений.


в отличие от сигилов перлса, к @ префикс перед именем переменной в C# не имеет смысла. Если x - это переменная, @x - это другое название для той же переменной.

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

но @ префикс есть использовать, как вы обнаружили - Вы можете использовать его для уточнения имен переменных, которые C# в противном случае отклонит как незаконные.

> string string;
Identifier expected; 'string' is a keyword

> string @string;

на @ символ позволяет использовать зарезервированные ключевые слова для имени переменной. как @int, @string, @double etc.

например:

string @public = "Reserved Keyword used for me and its fine";

приведенный выше код работает нормально, но ниже не работает:

string public = "This will not compile";

Это просто позволяет использовать зарезервированные слова в качестве имен переменных. Я хотел ВАР под названием event другой день. Я собирался пойти с _event вместо этого, но мой коллега напомнил мне, что я могу просто назвать это @event вместо.


другой вариант использования - в методах расширения. Первый, специальный параметр можно выделить, чтобы обозначить его реальное значение с помощью @this имя. Пример:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }

Если мы используем ключевое слово в качестве имени идентификатора, мы получаем ошибку компилятора "ожидаемый идентификатор", "имя идентификатора" является ключевым словом" Чтобы устранить эту ошибку, префикс идентификатора с "@". Такие идентификаторы являются дословными идентификаторами. Символ @ на самом деле не является частью идентификатора, поэтому идентификатор может рассматриваться на других языках как обычный идентификатор без префикса


вы можете использовать его, чтобы использовать зарезервированные слова в качестве имени переменной типа

 int @int = 3; 

компилятор будет игнорировать @ и скомпилируйте переменную как int

это не обычная практика, чтобы использовать мысль