2010-05-12 12 views
8

Ich bin gerade the source code of StyleCop, und ich fand eine merkwürdige Sache:Was ist @namespace-Feld in C# -Klasse?

/// <summary> 
/// The namespace that the rule is contained within. 
/// </summary> 
private string @namespace; 

// [...] 

internal Rule(string name, string @namespace, string checkId, string context, bool warning) : this(name, @namespace, checkId, context, warning, string.Empty, null, true, false) 
{ 
    Param.Ignore(name, @namespace, checkId, context, warning); 
} 

Was ist dieses Ding? Ist es nur ein einfaches Feld, in dem ein At-Zeichen verwendet wird, um anzuzeigen, dass es sich um ein Feld und nicht um ein namespace Schlüsselwort handelt? Wenn ja, darf At-Zeichen für jedes reservierte Wort verwendet werden (z. B. @dynamic, @using usw.)?

+0

Nicht nur reservierte Wörter; Sie können * jeden * Bezeichner mit einem @ beginnen. Warum? Denn * du weißt nicht, welche Wörter in Zukunft Schlüsselwörter sind *. Wenn Sie paranoid sind und befürchten, dass wir eines Tages "blah" in ein kontextabhängiges Schlüsselwort verwandeln, dann können Sie "int @blah" sagen. und stellen Sie sicher, dass Ihr Code auch dann kompiliert wird, wenn wir den Blah-Operator hinzufügen. –

+0

Beachten Sie auch, dass der Name des Feldes "Namespace" ist, nicht "@namespace". Das @ teilt dem Compiler lediglich mit, dass "das Folgende ein Name und kein Schlüsselwort ist". Es wird sonst ignoriert. –

Antwort

4

Ja @ Zeichen kann vor reservierte Wörter gesetzt werden, damit sie als Variablennamen verwendet werden können.

var @dynamic = ... 
var @event = .... 

ich wirklich gelernt, dass, und andere Dinge, von this question

6

Bascially ja. Wenn Sie @ vor den Variablennamen setzen, wird ein Fehler angezeigt, der darauf zurückzuführen ist, dass der Variablenname ein Schlüsselwort ist.

http://msdn.microsoft.com/en-us/library/x53a06bb(VS.71).aspx

+3

Was ist der Unterschied zu einem Unterstrich (oder einem anderen Zeichen)? – adrianm

+2

@adrianm: der Unterschied, den ich gefunden habe, ist, dass bei Verwendung der Reflexion 'FieldInfo.Name' wenn' @ Namespace' 'Namespace' ist, während der Name von '_namespace' '_namespace' ist. –

1

Ja, können Sie @ als first and only first Charakter Ihrer Variable verwenden.

0

Wie die anderen Menschen beantwortet, genau, können Sie so lange reservierte Schlüsselwörter benutzen, wie Sie das Präfix dann mit ‚@‘, aber IMHO, das ist keine gute Entwicklung der Praxis. Ich würde es lieber nur in maschinengeneriertem Code verwenden (zum Beispiel in der Firma, für die ich arbeite, haben wir ein Werkzeug, das Java-Code in C# konvertiert; da in Java "Ereignis" kein reserviertes Wort ist, könnte unser Java-Quellcode sein enthalten solche Kennungen)

Beste

Adriano

1

Diese Technik in der Regel mit automatischer Codegenerierung gekoppelt ist, als Bezeichner erzeugt werden können, die Schlüsselwörter in einer Zielsprache, zB Wenn ein Xml-Schema über eine Code-Generierung verfügt, um C# -Klassen zu erzeugen, kann das Schema ein Attribut namens "event" haben. Dies ist ein C# -Schlüsselwort, daher kann der Code-Generator stattdessen "@event" verwenden.