Qual è l'uso / il significato del carattere @ nei nomi delle variabili in C #?


298

Ho scoperto che puoi iniziare il nome della tua variabile con un carattere "@" in C #. Nel mio progetto C # stavo usando un servizio web (ho aggiunto un riferimento web al mio progetto) che è stato scritto in Java. Uno degli oggetti di interfaccia definiti nel WSDL aveva una variabile membro con il nome "params". Ovviamente questa è una parola riservata in C # quindi non puoi avere una classe con una variabile membro con il nome "params". L'oggetto proxy che è stato generato conteneva una proprietà simile a questa:

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

Ho cercato nella documentazione di VS 2008 c # ma non sono riuscito a trovare nulla al riguardo. Anche la ricerca di Google non mi ha dato risposte utili. Quindi qual è il significato esatto o l'uso del carattere "@" in un nome di variabile / proprietà?

Risposte:


306

Direttamente dalle specifiche del linguaggio C # , identificatori (C #) :

Il prefisso "@" consente l'uso di parole chiave come identificatori, utile per l'interfacciamento con altri linguaggi di programmazione. Il carattere @ non fa effettivamente parte dell'identificatore, quindi l'identificatore potrebbe essere visto in altre lingue come un normale identificatore, senza il prefisso. Un identificatore con un prefisso @ è chiamato identificatore testuale.


2
qual è la versione minima mirata di .NET supportata @?
serhio,

16
.NET stesso non definisce il @simbolo in questo modo, lo fa la specifica del linguaggio C #. Lo supporta dalla sua prima versione, C # 1.0 (rilasciato con .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.

9
E per coloro che si chiedono, in VB.NET è possibile utilizzare [ ]per specificare un identificatore testuale, ad es Dim [String] As String.
MicroVirus,

74

Ti consente solo di usare una parola riservata come nome di una variabile. IMHO non raccomandato (tranne in casi come te).


6
@rslite: +1 Non raccomandato :)
user7116

4
> mai +1 Non raccomandato, ma mai dire mai. Ad esempio, potrebbe essere necessario implementare un'interfaccia COM legacy che utilizza una parola chiave C # come identificatore. Oppure Microsoft potrebbe introdurre nuove parole chiave nelle nuove versioni del Framework, ad esempio rendimento in un'app di trading Bond .NET 1.1 :)
Joe,

2
@Joe: la nuova yieldparola chiave non è una parola riservata ed è utilizzabile solo in contesti in cui nessun identificatore potrebbe apparire legalmente . Un obiettivo quando si progettano nuove funzionalità per C # è costruirle in modo tale che qualsiasi programma che sia legale prima dell'aggiunta di una nuova funzionalità sia legale in seguito e abbia lo stesso significato .
supercat

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )è un buon esempio in cui non puoi davvero aggirarlo senza dover scrivere manualmente l'HTML o fare in modo che javascript modifichi gli attributi in una fase successiva.
Flater,

C'è una nuova tendenza che si vede nel software Open Source in cui tutte le variabili sono precedute dal simbolo "@" nel codice C #. Credo che ciò possa essere dovuto alla familiarità di questo requisito nel software PHP per le variabili. E molti sistemi web Open Source sono ora codificati in C # (dove in passato sarebbe stato PHP)
Wasted_Coder

36

In C # il carattere at (@) viene utilizzato per indicare i letterali che esplicitamente non aderiscono alle regole pertinenti nelle specifiche della lingua.

In particolare, può essere utilizzato per nomi di variabili che si scontrano con parole chiave riservate (ad esempio non è possibile utilizzare i parametri ma è possibile utilizzare @params, lo stesso con out / ref / qualsiasi altra parola chiave nella specifica della lingua). Inoltre può essere utilizzato per letterali stringa senza caratteri di escape; questo è particolarmente rilevante con le costanti del percorso, ad es. invece di path = "c:\\temp\\somefile.txt"poter scrivere path = @"c:\temp\somefile.txt". È anche molto utile per le espressioni regolari.


Punto interessante (e utile mnemonico) che la convenzione è la stessa tra "verbatim-" o " here-string " e denominazione dei parametri.
Ruffin,

13

A differenza dei sigilli di Perl, un @prefisso prima di un nome di variabile in C # non ha significato. If xè una variabile, @xè un altro nome per la stessa variabile.

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

Ma il @prefisso ha un uso , come hai scoperto - puoi usarlo per chiarire i nomi delle variabili che C # altrimenti rifiuterebbe come illegali.

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

> string @string;

10

Il @simbolo consente di utilizzare parole chiave riservate per il nome della variabile. come @int, @string,@double etc.

Per esempio:

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

Il codice sopra funziona bene, ma sotto non funzionerà:

string public = "This will not compile";

4

Ti permette semplicemente di usare parole riservate come nomi di variabili. Volevo un var chiamato eventl'altro giorno. Stavo per andare _eventinvece, ma il mio collega mi ha ricordato che avrei potuto semplicemente chiamarlo @event.


3

Un altro caso d'uso sono i metodi di estensione. Il primo parametro speciale può essere distinto per denotare il suo vero significato con il @thisnome. Un esempio:

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

Se utilizziamo una parola chiave come nome per un identificatore, otteniamo un errore del compilatore "identificatore previsto," Nome identificativo "è una parola chiave" Per superare questo errore, prefissa l'identificatore con "@". Tali identificatori sono identificativi testuali. Il carattere @ non fa effettivamente parte dell'identificatore, quindi l'identificatore potrebbe essere visto in altre lingue come un normale identificatore, senza il prefisso


1

Puoi usarlo per usare le parole chiave riservate come nome variabile come

 int @int = 3; 

il compilatore ignorerà @e compilerà la variabile comeint

non è una pratica comune usare il pensiero

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.