631 Stimmen

Was bedeutet das @-Symbol vor dem Variablennamen in C#?

Ich verstehe, dass das @-Symbol vor einem Zeichenfolgenliteral verwendet werden kann, um zu ändern, wie der Compiler die Zeichenfolge analysiert. Aber was bedeutet es, wenn einem Variablennamen das @-Symbol vorangestellt ist?

1 Stimmen

810voto

Michael Meadows Punkte 26846

Das @-Symbol ermöglicht es Ihnen, reservierte Wörter zu verwenden. Zum Beispiel:

int @class = 15;

Das obige Beispiel funktioniert, während das folgende nicht funktionieren würde:

int class = 15;

39 Stimmen

Mit was unterscheidet es sich von einem Unterstrich?

115 Stimmen

Mit einem @-Symbol wird der Name in der Assembly als "class" aufgezeichnet, während er mit einem Unterstrich als "_class" aufgezeichnet wird. Wenn also eine andere .NET-Sprache "class" nicht als reserviertes Wort definiert, könnten sie einfach den Namen "class" verwenden.

52 Stimmen

Wenn Sie @class für einen Eigenschaftsnamen verwendet haben, könnten Sie darauf so zugreifen: MyClass.class anstatt von MyClass._class

486voto

Micah Punkte 106323

Das @-Symbol hat 2 Zwecke in C#:

Zum einen ermöglicht es Ihnen, ein reserviertes Schlüsselwort als Variablen zu verwenden, wie zum Beispiel:

int @int = 15;

Die zweite Option ermöglicht es Ihnen, einen String festzulegen, ohne dass Sie irgendwelche Zeichen escapen müssen. Zum Beispiel ist das '\' Zeichen ein Escape-Zeichen, normalerweise müssten Sie also das hier tun:

var myString = "c:\\myfolder\\myfile.txt"

alternativ können Sie das machen:

var myString = @"c:\myFolder\myfile.txt"

35 Stimmen

Wie es sich auf Zeichenfolgen auswirkt, war genau das, wonach ich gesucht habe. Vielen Dank!

6 Stimmen

Vielen Dank, die Verwendung von @ für Zeichenfolgen war genau das, wonach ich gesucht habe.

7 Stimmen

Sie müssen doppelte Anführungszeichen immer noch durch Verdoppelung escapen.

66voto

Rasmus Faber Punkte 47181

Ein wichtiger Punkt, den die anderen Antworten vergessen haben, ist, dass "@keyword" im CIL zu "keyword" kompiliert wird.

Also, wenn Sie ein Framework haben, das beispielsweise in F# erstellt wurde und Sie eine Klasse mit einer Eigenschaft namens "class" definieren müssen, können Sie dies tatsächlich tun.

In der Praxis ist es nicht so nützlich, aber ohne dies würde C# einige Formen der Sprachinteroperabilität verhindern.

Ich sehe es normalerweise nicht für die Interop verwendet, sondern um die Schlüsselwortbeschränkungen zu umgehen (normalerweise bei lokalen Variablennamen, wo dies der einzige Effekt ist), d.h.

private void Foo(){
   int @this = 2;
}

aber das würde ich dringend abraten! Finden Sie einfach einen anderen Namen, auch wenn der 'beste' Name für die Variable einer der reservierten Namen ist.

5 Stimmen

Das ist wahrscheinlich ein guter Rat. Ich denke, dass der @-Qualifier dem eckigen Klammern in VB.Net entspricht, also wäre das VB-Äquivalent: dim [Klasse] as Int32 = 15

5 Stimmen

@Michael Es ist genau das Äquivalent zur eckigen Klammer Syntax von VB.NET. stackoverflow.com/questions/6639688/… weist darauf hin, dass F# doppelte Backticks um einen Bezeichner verwendet, um den gleichen Zweck zu erfüllen.

4 Stimmen

Als späte Anmerkung - "nicht dass es SO nützlich ist" - bei MVC ist das der Weg, wie du eine Eigenschaft namens "Klasse" an das Render e weitergeben kannst, was sich in HTML "Klasse" verwandelt, um die CSS-Klasse zu definieren.

17voto

Joel Coehoorn Punkte 377088

Es ermöglicht Ihnen, ein C#-Schlüsselwort als Variable zu verwenden. Zum Beispiel:

Klasse MyClass
{
   public string name { get; set; }
   public string @class { get; set; }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X