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

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

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

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


person Remko Jansen    schedule 18.09.2008    source источник


Ответы (9)


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

Префикс «@» позволяет использовать ключевые слова в качестве идентификаторов, что полезно при взаимодействии с другими языками программирования. Символ @ на самом деле не является частью идентификатора, поэтому идентификатор может рассматриваться в других языках как обычный идентификатор без префикса. Идентификатор с префиксом @ называется дословным идентификатором.

person Atif Aziz    schedule 18.09.2008
comment
какая целевая минимальная версия .NET поддерживает @? - person serhio; 06.07.2010
comment
Сама .NET не определяет символ @, как это, в спецификации языка C #. Он поддерживает это с момента выхода своей первой версии C # 1.0 (выпущенной вместе с .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx - person Tim S.; 04.06.2013
comment
И для тех, кому интересно, в VB.NET вы можете использовать [ ] для указания дословного идентификатора, например. Dim [String] As String. - person MicroVirus; 28.04.2014

Он просто позволяет вам использовать зарезервированное слово в качестве имени переменной. Не рекомендуется ИМХО (кроме случаев, как у вас).

person rslite    schedule 18.09.2008
comment
@rslite: +1 Не рекомендуется :) - person user7116; 18.09.2008
comment
никогда +1 Не рекомендуется, но никогда не говори никогда. Например, вам может потребоваться реализовать устаревший интерфейс COM, который использует ключевое слово C # в качестве идентификатора. Или Microsoft может ввести новые ключевые слова в новые версии Framework - например, доходность в приложении для торговли облигациями .NET 1.1 :) - person Joe; 18.09.2008
comment
@Joe: новое ключевое слово yield не является зарезервированным словом и может использоваться только в контекстах, где не может присутствовать идентификатор на законных основаниях. Одна из целей при разработке новых функций для C # состоит в том, чтобы сконструировать их таким образом, чтобы любая программа, которая была бы законной до добавления новой функции, была бы законной впоследствии и имела то же значение. - person supercat; 07.09.2013
comment
@Html.TextboxFor( , , , new { @class="my-css-class" } ) - хороший пример, когда вы не можете обойтись без этого вручную, не написав HTML или не заставив javascript изменить атрибуты на более позднем этапе. - person Flater; 19.05.2014
comment
В программном обеспечении с открытым исходным кодом наблюдается новая тенденция, когда все переменные имеют префикс @ в коде C #. Я считаю, что это может быть из-за того, что это требование знакомо с программным обеспечением PHP для переменных. И многие веб-системы с открытым исходным кодом теперь написаны на C # (в прошлом это был PHP). - person Wasted_Coder; 05.03.2016
comment
Или любое ключевое слово, зарезервированное или нет. from - внешне незарезервированное ключевое слово - я только что видел код, в котором параметр метода объявлен как string from, но в теле метода он упоминается как @from, предположительно, чтобы предотвратить его интерпретацию как начало LINQ выражение. - person Stewart; 30.05.2016

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

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

person Tomer Gabel    schedule 18.09.2008
comment
Интересный момент (и полезная мнемоника), что соглашение одинаково между дословным- или здесь-строки и именования параметров. - person ruffin; 21.03.2019

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

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

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

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

> string @string;
person Colonel Panic    schedule 15.02.2013

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

Например:

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

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

string public = "This will not compile";
person Umar Abbas    schedule 03.04.2014

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

person Mark Embling    schedule 18.09.2008

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

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if ([email protected](key))
        {
            return defaultValue;
        }

        return @this[key];
    }
person BartoszKP    schedule 03.12.2013

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

person Community    schedule 24.02.2009

Вы можете использовать его для использования зарезервированных ключевых слов в качестве имени переменной, например

 int @int = 3; 

компилятор проигнорирует @ и скомпилирует переменную как int

мыслить не принято

person Mina Gabriel    schedule 15.02.2014