Quelle est l'utilité / la signification du caractère @ dans les noms de variables en C #?

298

J'ai découvert que vous pouvez commencer le nom de votre variable avec un caractère '@' en C #. Dans mon projet C #, j'utilisais un service Web (j'ai ajouté une référence Web à mon projet) écrit en Java. Un des objets d'interface définis dans le WSDL avait une variable membre avec le nom "params". Évidemment, c'est un mot réservé en C # donc vous ne pouvez pas avoir une classe avec une variable membre avec le nom "params". L'objet proxy généré contenait une propriété qui ressemblait à ceci:

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

J'ai cherché dans la documentation VS 2008 c # mais je n'ai rien trouvé à ce sujet. De plus, la recherche sur Google ne m'a pas donné de réponses utiles. Alors, quelle est la signification exacte ou l'utilisation du caractère «@» dans un nom de variable / propriété?

Remko Jansen
la source

Réponses:

306

Directement à partir de la spécification du langage C # , identificateurs (C #) :

Le préfixe "@" permet d'utiliser des mots clés comme identifiants, ce qui est utile lors de l'interface avec d'autres langages de programmation. Le caractère @ ne fait pas réellement partie de l'identifiant, donc l'identifiant peut être vu dans d'autres langues comme un identifiant normal, sans le préfixe. Un identifiant avec un préfixe @ est appelé identifiant textuel.

Atif Aziz
la source
2
Quelle est la version minimale ciblée de .NET prise en charge @?
serhio
16
.NET lui-même ne définit pas le @symbole comme celui-ci, contrairement à la spécification du langage C #. Il prend en charge cela depuis sa première version, C # 1.0 (publiée avec .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
9
Et pour ceux qui se demandent, dans VB.NET, vous pouvez utiliser [ ]pour spécifier un identifiant textuel, par exemple Dim [String] As String.
MicroVirus
74

Il vous permet simplement d'utiliser un mot réservé comme nom de variable. IMHO non recommandé (sauf dans les cas comme vous l'avez).

rslite
la source
6
@rslite: +1 Non recommandé :)
user7116
4
> jamais +1 Non recommandé, mais ne dites jamais jamais. Vous pouvez par exemple avoir besoin d'implémenter une interface COM héritée qui utilise un mot clé C # comme identifiant. Ou Microsoft peut introduire de nouveaux mots clés dans les nouvelles versions du Framework - par exemple, le rendement dans une application de trading d'obligations .NET 1.1 :)
Joe
2
@Joe: Le nouveau yieldmot-clé n'est pas un mot réservé et n'est utilisable que dans des contextes où aucun identifiant ne peut légalement apparaître . Un objectif lors de la conception de nouvelles fonctionnalités pour C # est de les construire de telle manière que tout programme qui serait légal avant l'ajout d'une nouvelle fonctionnalité le devienne par la suite et ait la même signification .
supercat
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )est un bon exemple où vous ne pouvez pas vraiment le contourner sans avoir à écrire manuellement le code HTML ou demander à javascript de modifier les attributs à un stade ultérieur.
Flater
Il y a une nouvelle tendance qui se voit dans les logiciels Open Source où toutes les variables sont préfixées avec le symbole "@" dans le code C #. Je crois que cela peut être dû à la familiarité de cette exigence dans le logiciel PHP pour les variables. Et beaucoup de systèmes Web Open Source sont maintenant codés en C # (alors que dans le passé cela aurait été PHP)
Wasted_Coder
36

En C #, le caractère at (@) est utilisé pour désigner des littéraux qui explicitement n'adhèrent pas aux règles pertinentes de la spécification de langue.

Plus précisément, il peut être utilisé pour les noms de variables qui se heurtent aux mots clés réservés (par exemple, vous ne pouvez pas utiliser de paramètres mais vous pouvez utiliser @params à la place, de même avec out / ref / tout autre mot clé dans la spécification de langue). De plus, il peut être utilisé pour des littéraux de chaîne non échappés; ceci est particulièrement pertinent avec les constantes de chemin, par exemple au lieu de path = "c:\\temp\\somefile.txt"vous pouvez écrire path = @"c:\temp\somefile.txt". Il est également très utile pour les expressions régulières.

Tomer Gabel
la source
Point intéressant (et mnémonique utile) que la convention est la même entre "verbatim-" ou " here-strings " et la dénomination des paramètres.
ruffin
13

Contrairement aux sigils de Perl, un @préfixe devant un nom de variable en C # n'a aucune signification. Si xest une variable, @xest un autre nom pour la même variable.

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

Mais le @préfixe a une utilité , comme vous l'avez découvert - vous pouvez l'utiliser pour clarifier les noms de variables que C # rejetterait autrement comme illégaux.

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

> string @string;
Colonel Panic
la source
10

Le @symbole vous permet d'utiliser des mots clés réservés pour le nom de variable. comme @int, @string, @doubleetc.

Par exemple:

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

Le code ci-dessus fonctionne bien, mais ci-dessous ne fonctionnera pas:

string public = "This will not compile";
Umar Abbas
la source
4

Il vous permet simplement d'utiliser des mots réservés comme noms de variables. Je voulais un var appelé eventl'autre jour. J'allais y aller à la _eventplace, mais mon collègue m'a rappelé que je pouvais simplement l'appeler à la @eventplace.

Mark Embling
la source
3

Les méthodes d'extension constituent un autre cas d'utilisation. Le premier paramètre spécial peut être distingué pour indiquer sa véritable signification avec le @thisnom. Un exemple:

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
la source
1

Si nous utilisons un mot-clé comme nom pour un identifiant, nous obtenons une erreur de compilation "identifiant attendu, 'Identifier Name' est un mot-clé" Pour surmonter cette erreur, préfixez l'identifiant avec "@". Ces identifiants sont des identifiants textuels. Le caractère @ ne fait pas réellement partie de l'identifiant, donc l'identifiant peut être vu dans d'autres langues comme un identifiant normal, sans le préfixe

raji vineeth
la source
1

Vous pouvez l'utiliser pour utiliser les mots clés réservés comme nom de variable comme

 int @int = 3; 

le compilateur ignore la @et compile la variable commeint

ce n'est pas une pratique courante d'utiliser la pensée

Mina Gabriel
la source