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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
309
0
44 867
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

@rslite: +1 Не рекомендуется :)

user7116 18.09.2008 16:14

> никогда +1 Не рекомендуется, но никогда не говори никогда. Например, вам может потребоваться реализовать устаревший интерфейс COM, который использует ключевое слово C# в качестве идентификатора. Или Microsoft может ввести новые ключевые слова в новые версии Framework - например, доходность в приложении для торговли облигациями .NET 1.1 :)

Joe 18.09.2008 22:15

@Joe: новое ключевое слово yield не является зарезервированным словом и может использоваться только в контекстах, где ни один идентификатор не мог появиться на законных основаниях. Одна из целей при разработке новых функций для C# состоит в том, чтобы сконструировать их таким образом, чтобы любая программа, которая была легальной до добавления новой функции, стала законной после и иметь то же значение.

supercat 07.09.2013 02:50

@Html.TextboxFor( , , , new { @class = "my-css-class" } ) - хороший пример, когда вы не можете обойти это без необходимости вручную писать HTML или без того, чтобы javascript изменил атрибуты на более позднем этапе.

Flater 19.05.2014 15:57

В программном обеспечении с открытым исходным кодом наблюдается новая тенденция, когда все переменные имеют префикс «@» в коде C#. Я считаю, что это может быть из-за того, что это требование знакомо с программным обеспечением PHP для переменных. И многие веб-системы с открытым исходным кодом теперь написаны на C# (в прошлом это был PHP).

Wasted_Coder 05.03.2016 22:36

Или любое ключевое слово, зарезервированное или нет. from, по внешнему виду, является безоговорочным ключевым словом - я только что видел код, в котором параметр метода объявлен как string from, но в теле метода он упоминается как @from, предположительно, чтобы предотвратить его интерпретацию как начало LINQ. выражение.

Stewart 30.05.2016 13:26

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

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

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

Интересный момент (и полезная мнемоника) - то же самое соглашение между именами параметров "дословно-" или "здесь струны" и одинаково.

ruffin 21.03.2019 18:39
Ответ принят как подходящий

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

The prefix "@" enables the use of keywords as identifiers, which is useful when interfacing with other programming languages. The character @ is not actually part of the identifier, so the identifier might be seen in other languages as a normal identifier, without the prefix. An identifier with an @ prefix is called a verbatim identifier.

Какая целевая минимальная версия .NET поддерживает @?

serhio 06.07.2010 01:08

Сама .NET не определяет символ @, как это, в спецификации языка C#. Он поддерживает это с момента выхода своей первой версии C# 1.0 (выпущенной вместе с .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx

Tim S. 04.06.2013 18:00

И для тех, кому интересно, в VB.NET вы можете использовать [ ] для указания дословного идентификатора, например. Dim [String] As String.

MicroVirus 28.04.2014 15:24

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

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

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

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

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

> string @string;

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

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

        return @this[key];
    }

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

 int @int = 3; 

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

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

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

Например:

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

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

string public = "This will not compile";

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