Was ist die Verwendung / Bedeutung des @ -Zeichens in Variablennamen in C #?

298

Ich habe festgestellt, dass Sie Ihren Variablennamen mit einem '@' in C # beginnen können. In meinem C # -Projekt habe ich einen Webdienst verwendet (ich habe meinem Projekt einen Webverweis hinzugefügt), der in Java geschrieben wurde. Eines der in der WSDL definierten Schnittstellenobjekte hatte eine Mitgliedsvariable mit dem Namen "params". Offensichtlich ist dies ein reserviertes Wort in C #, sodass Sie keine Klasse mit einer Mitgliedsvariablen mit dem Namen "params" haben können. Das generierte Proxy-Objekt enthielt eine Eigenschaft, die folgendermaßen aussah:

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

Ich habe die VS 2008 c # -Dokumentation durchsucht, konnte aber nichts darüber finden. Auch die Suche bei Google hat mir keine nützlichen Antworten gegeben. Was ist also die genaue Bedeutung oder Verwendung des Zeichens '@' in einem Variablen- / Eigenschaftsnamen?

Remko Jansen
quelle

Antworten:

306

Direkt aus der C # -Sprachenspezifikation , Bezeichner (C #) :

Das Präfix "@" ermöglicht die Verwendung von Schlüsselwörtern als Bezeichner, was bei der Schnittstelle mit anderen Programmiersprachen hilfreich ist. Das Zeichen @ ist eigentlich nicht Teil des Bezeichners, daher kann der Bezeichner in anderen Sprachen als normaler Bezeichner ohne Präfix angezeigt werden. Ein Bezeichner mit einem @ -Präfix wird als wörtlicher Bezeichner bezeichnet.

Atif Aziz
quelle
2
Was ist die angestrebte minimale Version von .NET, die unterstützt wird @?
Serhio
16
.NET selbst definiert das @Symbol nicht so wie die C # -Sprachenspezifikation. Es unterstützt dies seit seiner ersten Version, C # 1.0 (veröffentlicht mit .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
9
Und für diejenigen, die sich fragen, können Sie in VB.NET [ ]eine wörtliche Kennung angeben, z Dim [String] As String.
MicroVirus
74

Sie können lediglich ein reserviertes Wort als Variablennamen verwenden. IMHO nicht empfohlen (außer in Fällen wie Sie).

rslite
quelle
6
@rslite: +1 Nicht empfohlen :)
user7116
4
> nie +1 Nicht empfohlen, aber niemals nie sagen. Möglicherweise müssen Sie beispielsweise eine ältere COM-Schnittstelle implementieren, die ein C # -Schlüsselwort als Kennung verwendet. Oder Microsoft führt möglicherweise neue Schlüsselwörter in neuen Versionen des Frameworks ein - z. B. Rendite in einer .NET 1.1-Anleihenhandels-App :)
Joe,
2
@Joe: Das neue yieldSchlüsselwort ist kein reserviertes Wort und kann nur in Kontexten verwendet werden, in denen keine Kennung legal erscheinen könnte . Ein Ziel beim Entwerfen neuer Features für C # besteht darin, sie so zu erstellen, dass jedes Programm, das vor dem Hinzufügen eines neuen Features legal war, danach legal ist und dieselbe Bedeutung hat .
Supercat
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )ist ein gutes Beispiel, bei dem Sie es nicht wirklich umgehen können, ohne den HTML-Code manuell schreiben zu müssen oder die Attribute zu einem späteren Zeitpunkt von Javascript ändern zu lassen.
Flater
Es gibt einen neuen Trend in der Open Source-Software, bei dem allen Variablen das Symbol "@" im C # -Code vorangestellt ist. Ich glaube, dies kann an der Vertrautheit dieser Anforderung in der PHP-Software für Variablen liegen. Und viele Open Source-Websysteme sind jetzt in C # codiert (wo es früher PHP gewesen wäre)
Wasted_Coder
36

In C # wird das Zeichen at (@) verwendet, um Literale zu bezeichnen, die explizit nicht den relevanten Regeln in der Sprachspezifikation entsprechen.

Insbesondere kann es für Variablennamen verwendet werden, die mit reservierten Schlüsselwörtern in Konflikt stehen (z. B. können Sie keine Parameter verwenden, aber Sie können stattdessen @params verwenden, genauso wie mit out / ref / einem anderen Schlüsselwort in der Sprachspezifikation). Zusätzlich kann es für nicht entkappte String-Literale verwendet werden. Dies ist besonders relevant bei Pfadkonstanten, z. B. anstatt dass path = "c:\\temp\\somefile.txt"Sie schreiben können path = @"c:\temp\somefile.txt". Es ist auch sehr nützlich für reguläre Ausdrücke.

Tomer Gabel
quelle
Interessanter Punkt (und nützliche Mnemonik), dass die Konvention zwischen "wörtlich" oder " hier-Zeichenfolgen " und Parameternamen gleich ist.
Ruffin
13

Im Gegensatz zu Perls Siegeln hat ein @Präfix vor einem Variablennamen in C # keine Bedeutung. Wenn xes sich um eine Variable handelt, @xhandelt es sich um einen anderen Namen für dieselbe Variable.

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

Wie Sie festgestellt @haben, hat das Präfix jedoch eine Verwendung. Sie können es verwenden, um Variablennamen zu klären, die C # sonst als illegal ablehnen würde.

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

> string @string;
Oberst Panik
quelle
10

Mit dem @Symbol können Sie reservierte Schlüsselwörter für den Variablennamen verwenden. wie @int, @string,@double usw.

Zum Beispiel:

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

Der obige Code funktioniert gut, aber der folgende funktioniert nicht:

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

Sie können einfach reservierte Wörter als Variablennamen verwenden. Ich wollte neulich einen Var namens event. Ich wollte _eventstattdessen mitgehen , aber mein Kollege erinnerte mich daran, dass ich es @eventstattdessen einfach anrufen könnte .

Mark Embling
quelle
3

Ein weiterer Anwendungsfall sind Erweiterungsmethoden. Der erste spezielle Parameter kann unterschieden werden, um seine wahre Bedeutung mit dem @thisNamen zu kennzeichnen . Ein Beispiel:

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
quelle
1

Wenn wir ein Schlüsselwort als Namen für einen Bezeichner verwenden, wird der Compilerfehler "Bezeichner erwartet, 'Bezeichnername' ist ein Schlüsselwort" angezeigt. Um diesen Fehler zu beheben, stellen Sie dem Bezeichner "@" voran. Solche Bezeichner sind wörtliche Bezeichner. Das Zeichen @ ist eigentlich nicht Teil des Bezeichners, daher kann der Bezeichner in anderen Sprachen als normaler Bezeichner ohne Präfix angezeigt werden

Raji Vineeth
quelle
1

Sie können es verwenden, um die reservierten Schlüsselwörter als Variablennamen wie zu verwenden

 int @int = 3; 

Der Compiler ignoriert das @und kompiliert die Variable alsint

Es ist keine übliche Praxis, Gedanken zu verwenden

Mina Gabriel
quelle