Яке використання / значення символу @ у назвах змінних у 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 @?
serhio

16
.NET сам не визначає такий @символ, як це, специфікація мови C # робить. Він підтримує це з моменту своєї першої версії, C # 1.0 (випускається з .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Тім С.

9
А для тих, хто цікавиться, у VB.NET ви можете [ ]вказати дослівний ідентифікатор, наприклад Dim [String] As String.
MicroVirus

74

Це просто дозволяє використовувати зарезервоване слово як ім'я змінної. Не рекомендується IMHO (за винятком випадків, як у вас).


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

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

2
@Joe: Нове yieldключове слово не є зарезервованим словом, і його можна використовувати лише в контекстах, де жоден ідентифікатор не міг легально відображатися . Однією метою при розробці нових функцій для C # є побудова їх таким чином, що будь-яка програма, яка була б законною до того, як додана нова функція, буде законною згодом і матиме те саме значення .
supercat

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

Існує нова тенденція, яка спостерігається в програмному забезпеченні з відкритим кодом, де всі змінні мають префікс із символом "@" у коді C #. Я вважаю, це може бути через ознайомлення з цією вимогою в PHP для змінних. І багато веб-систем з відкритим кодом зараз кодуються в C # (де раніше це було б PHP)
Wasted_Coder

36

У C # символ at (@) використовується для позначення літералів, які явно не дотримуються відповідних правил у мовній специфікації.

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


Цікавий момент (і корисний мнемонічний), що умова є однаковою між "дословним" або " тут-рядками " і іменем параметрів.
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];
    }

1

Якщо ми використовуємо ключове слово в якості імені для ідентифікатора, ми отримуємо помилку компілятора "ідентифікатор очікується, ім'я ідентифікатора" - це ключове слово ". Щоб подолати цю помилку, приставте ідентифікатор" @ ". Такі ідентифікатори є дослівними ідентифікаторами. Символ @ насправді не є частиною ідентифікатора, тому ідентифікатор може розглядатися іншими мовами як звичайний ідентифікатор, без префікса


1

Ви можете використовувати його, щоб використовувати зарезервовані ключові слова як назву змінної

 int @int = 3; 

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

не звичайна практика використання думки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.