2009-04-07 13 views
9

Kilka razy widziałem ReSharper wygenerować kod, który wygląda tak:Czy przedrostek @ dla delegatów ma jakieś specjalne znaczenie?

delegate void myHandler(int i); 
myHandler myHandlerContainer; 
... 
foreach (Delegate @delegate in myHandlerContainer.GetInvocationList()) 
{...} 

Czy „@” w @delegate dać tej zmiennej żadnego specjalnego znaczenia semantycznego?
A może to tylko konwencja, której wcześniej nie spotkałem?

Odpowiedz

14

Niektóre więcej szczegółów z MSDN:

Przedrostek „@” umożliwia wykorzystanie słów kluczowych jako identyfikatory, które jest przydatnych podczas łączenia z innymi języków programowania. Znak @ nie jest częścią identyfikatora , więc identyfikator może być widziany w innych językach jako normalny identyfikator , bez prefiksu. Identyfikator z prefiksem @ jest nazywany pełnym identyfikatorem. Użycie prefiksu @ dla identyfikatorów niebędących słowami kluczowymi jest dozwolone, ale zdecydowanie odradza się ze względu na styl.

z C# Language Specification: 2.4.2 Identifiers.

Dzięki temu prefixowanie z "@" umożliwia np. wywodzić się z klasy o nazwie "delegat", która może być zdefiniowana w bibliotece napisanej w innym języku niż C#.

W żadnym innym przypadku nie poleciłbym używać tej składni i raczej tworzyć identyfikatory inne niż słowa kluczowe w języku C# (np. Wartość zamiast wartości) w celu zwiększenia czytelności kodu i uniknięcia zamieszania, niezależnie od tego, czy jest do niego dołączone specjalne znaczenie.

Istnieje również inny ciekawy fakt o zmiennej nazewnictwa wspomniano tam:

Identyfikatory zawierające dwa kolejne znaków podkreślenia (U + 005F) są zastrzeżone do użytku przez realizację . Na przykład implementacja może dostarczyć rozszerzonych słów kluczowych rozpoczynających się od dwóch podkreśleń .

+0

Doskonale! Oto referencja, której szukałem :-) – devstuff

12

"@delegate" służy do odróżnienia nazwy zmiennej od słowa kluczowego "delegate".

Powiązane problemy