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

298

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

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

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

Ремко Янсен
источник

Ответы:

306

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

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

Атиф Азиз
источник
2
Что такое целевая минимальная версия .NET, поддерживающая @?
Серхио
16
Сам по себе .NET не определяет @символ, как это делает спецификация языка C #. Он поддерживал это начиная с первой версии C # 1.0 (выпущенной с .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Тим С.
9
И для тех, кто интересуется, в VB.NET вы можете использовать [ ]для указания дословного идентификатора, например Dim [String] As String.
MicroVirus
74

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

rslite
источник
6
@rslite: +1 Не рекомендуется :)
user7116
4
> Никогда +1 Не рекомендуется, но никогда не говори никогда. Например, вам может понадобиться реализовать устаревший интерфейс COM, который использует ключевое слово C # в качестве идентификатора. Или Microsoft может вводить новые ключевые слова в новых версиях Framework - например, доходность в торговом приложении .NET 1.1 Bond :)
Joe
2
@Joe: новое yieldключевое слово не является зарезервированным словом, и его можно использовать только в тех случаях, когда ни один идентификатор не может появиться на законных основаниях . Одна из целей при разработке новых функций для C # состоит в том, чтобы сконструировать их таким образом, чтобы любая программа, которая была бы законной до добавления новой функции, впоследствии будет легальной и будет иметь то же значение .
суперкат
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )хороший пример, когда вы не можете обойти это без необходимости вручную писать HTML или javascript изменить атрибуты на более позднем этапе.
Флатер
Существует новая тенденция в программном обеспечении с открытым исходным кодом, где все переменные имеют префикс «@» в коде C #. Я полагаю, что это может быть связано со знакомством этого требования в программном обеспечении PHP для переменных. И многие веб-системы с открытым исходным кодом в настоящее время написаны на C # (где раньше это был PHP)
Wasted_Coder
36

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

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

Томер Габель
источник
Интересный момент (и полезная мнемоника) в том, что соглашение "verbatim-" или " here-strings " и именование параметров одинаково .
ruffin
13

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

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

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

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

> string @string;
Полковник паника
источник
10

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

Например:

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

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

string public = "This will not compile";
Умар Аббас
источник
4

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

Марк Эмблинг
источник
3

Другим вариантом использования являются методы расширения. Первый, специальный параметр можно различить, чтобы обозначить его реальное значение @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];
    }
BartoszKP
источник
1

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

Раджи Винет
источник
1

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

 int @int = 3; 

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

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

Мина Габриэль
источник