2010-05-12 15 views
8

ja przeglądania the source code of StyleCop i znalazłem ciekawą rzecz:Co to jest pole @namespace w klasie C#?

/// <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); 
} 

Co to jest? Czy jest to po prostu proste pole, w którym znak jest używany do wskazania, że ​​jest to słowo kluczowe, a nie słowo kluczowe namespace? Jeśli tak, to możesz użyć znaku-at dla dowolnego słowa zastrzeżonego (na przykład @dynamic, @using itd.)?

+0

Nie tylko słowa zastrzeżone; możesz rozpocząć * dowolny * identyfikator przy pomocy @. Czemu? Ponieważ * nie wiesz, jakie słowa będą słowami kluczowymi w przyszłości *. Jeśli masz paranoję i obawiasz się, że pewnego dnia zmienimy słowo "blah" na słowo kluczowe kontekstualnie, możesz powiedzieć "int @ bla"; i upewnij się, że twój kod będzie się dalej kompilował, nawet jeśli dodamy operatora bla. –

+0

Należy również zauważyć, że nazwa pola to "namespace", a nie "@namespace". @ Tylko mówi kompilatorowi "rzeczą, która następuje jest nazwa, a nie słowo kluczowe". W przeciwnym razie jest ignorowane. –

Odpowiedz

4

Znaku Tak można wstawić przed słowami zastrzeżonymi, aby umożliwić ich użycie jako nazw zmiennych.

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

I rzeczywiście dowiedział się, że i inne rzeczy, z this question

6

Bascially tak. Umieszczenie znaku @ przed nazwą zmiennej zatrzymuje błąd występujący z powodu tego, że nazwa zmiennej jest słowem kluczowym.

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

+3

Czym różni się umieszczanie znaku podkreślenia (lub innego znaku) na wierzchu? – adrianm

+2

@adrianm: Różnica, którą odkryłem, polega na tym, że podczas używania refleksji, 'FieldInfo.Name', jeśli' @ namespace' będzie "przestrzenią nazw", podczas gdy nazwa '_namespace' będzie" _namespace ". –

1

Tak, można użyć jako first and only first@ charakteru zmiennej.

0

Tak jak inne osoby odpowiedziały, można użyć zastrzeżonych słów kluczowych, o ile przedrostek jest poprzedzony znakiem "@", ale IMHO, to nie jest dobra praktyka programistyczna. Wolę używać go tylko w kodzie wygenerowanym maszynowo (na przykład w firmie, dla której pracuję, mamy narzędzie, które konwertuje kod Java na język C#, ponieważ w języku Java "zdarzenie" nie jest słowem zastrzeżonym, nasz kod źródłowy Java może zawierają takie identyfikatory)

Najlepszy

Adriano

1

Ta technika jest zwykle połączone z automatycznego generowania kodu, jak identyfikatory mogą być produkowane, że są to słowa kluczowe w języku docelowym, np jeśli schemat Xml generuje kod generujący kod w celu wygenerowania klas C#, schemat może mieć atrybut o nazwie "zdarzenie". To jest słowo kluczowe C#, więc generator kodu może zamiast tego użyć "@event".