Jakie jest użycie / znaczenie znaku @ w nazwach zmiennych w C #?

298

Odkryłem, że możesz zacząć swoją nazwę zmiennej znakiem „@” w C #. W moim projekcie C # korzystałem z usługi internetowej (dodałem odnośnik do mojego projektu) napisanej w Javie. Jeden z obiektów interfejsu zdefiniowanych w WSDL miał zmienną składową o nazwie „params”. Oczywiście jest to słowo zastrzeżone w języku C #, więc nie możesz mieć klasy ze zmienną składową o nazwie „params”. Wygenerowany obiekt proxy zawierał właściwość, która wyglądała następująco:

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

Przeszukałem dokumentację VS 2008 c #, ale nic nie mogłem znaleźć. Również wyszukiwanie w Google nie dało mi żadnych użytecznych odpowiedzi. Jakie jest zatem dokładne znaczenie lub użycie znaku „@” w nazwie zmiennej / właściwości?

Remko Jansen
źródło

Odpowiedzi:

306

Prosto ze specyfikacji języka C # , identyfikatory (C #) :

Prefiks „@” umożliwia użycie słów kluczowych jako identyfikatorów, co jest przydatne podczas łączenia się z innymi językami programowania. Znak @ nie jest tak naprawdę częścią identyfikatora, więc identyfikator może być postrzegany w innych językach jako normalny identyfikator bez prefiksu. Identyfikator z przedrostkiem @ nazywa się dosłownie identyfikatorem.

Atif Aziz
źródło
2
Jaka jest docelowa minimalna wersja platformy .NET @?
serhio
16
Sam .NET nie definiuje takiego @symbolu, tak jak specyfikacja języka C #. Obsługuje to od swojej pierwszej wersji, C # 1.0 (wydanej z .NET 1.0). csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.
9
A dla tych, którzy się zastanawiają, w VB.NET można użyć [ ]dokładnego identyfikatora, np Dim [String] As String.
MicroVirus
74

Pozwala tylko użyć słowa zarezerwowanego jako nazwy zmiennej. Niezalecane IMHO (z wyjątkiem przypadków takich jak ty).

rslite
źródło
6
@rslite: +1 Niezalecane :)
user7116 18.09.08
4
> nigdy +1 Nie zalecane, ale nigdy nie mów nigdy. Może być konieczne na przykład zaimplementowanie starszego interfejsu COM, który używa słowa kluczowego C # jako identyfikatora. Lub Microsoft może wprowadzić nowe słowa kluczowe w nowych wersjach Frameworka - np. Zysk w aplikacji do handlu obligacjami .NET 1.1 :)
Joe
2
@Joe: Nowe yieldsłowo kluczowe nie jest słowem zastrzeżonym i można go używać tylko w kontekstach, w których legalnie nie może pojawić się żaden identyfikator . Jednym z celów przy projektowaniu nowych funkcji dla C # jest skonstruowanie ich w taki sposób, aby każdy program, który byłby legalny przed dodaniem nowej funkcji, był później legalny i miał takie samo znaczenie .
supercat
6
@Html.TextboxFor( , , , new { @class="my-css-class" } )to dobry przykład, w którym tak naprawdę nie można się obejść bez konieczności ręcznego pisania kodu HTML lub konieczności zmiany atrybutów javascript na późniejszym etapie.
Flater
Pojawił się nowy trend w oprogramowaniu Open Source, w którym wszystkie zmienne są poprzedzone symbolem „@” w kodzie C #. Myślę, że może to wynikać ze znajomości tego wymagania w oprogramowaniu PHP dla zmiennych. I wiele systemów sieciowych Open Source jest teraz kodowanych w języku C # (gdzie w przeszłości byłby to PHP)
Wasted_Coder
36

W języku C # znak at (@) jest używany do oznaczenia literałów, które jawnie nie są zgodne z odpowiednimi regułami w specyfikacji języka.

W szczególności można go stosować do nazw zmiennych, które kolidują z zastrzeżonymi słowami kluczowymi (np. Nie można używać parametrów, ale można zamiast tego używać @params, podobnie jak w przypadku out / ref / dowolnego innego słowa kluczowego w specyfikacji języka). Dodatkowo może być używany do literałów ciągów bez kształtów; jest to szczególnie istotne w przypadku stałych ścieżki, np. zamiast path = "c:\\temp\\somefile.txt"pisać path = @"c:\temp\somefile.txt". Jest to również bardzo przydatne w przypadku wyrażeń regularnych.

Tomer Gabel
źródło
Interesujący punkt (i użyteczny mnemonik), że konwencja jest taka sama między „dosłownie” lub „ ciągi tutaja nazewnictwem parametrów.
ruffin
13

W przeciwieństwie do znaków Perla, @przedrostek przed nazwą zmiennej w języku C # nie ma znaczenia. Jeśli xjest zmienną, @xto inna nazwa tej samej zmiennej.

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

Ale @prefiks ma zastosowanie , jak odkryłeś - możesz go użyć do wyjaśnienia nazw zmiennych, które w przeciwnym razie C # odrzuciłby jako nielegalny.

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

> string @string;
Pułkownik Panika
źródło
10

@Symbol pozwala używać zarezerwowanych słów kluczowych dla nazwy zmiennej. jak @int, @string,@double itd.

Na przykład:

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

Powyższy kod działa dobrze, ale poniżej nie będzie działać:

string public = "This will not compile";
Umar Abbas
źródło
4

Pozwala po prostu używać słów zastrzeżonych jako nazw zmiennych. Chciałem var, który nazwał eventkiedyś. Miałem zamiar _eventzamiast tego, ale mój kolega przypomniał mi, że mogę po prostu to nazwać @event.

Mark Embling
źródło
3

Innym przypadkiem użycia są metody rozszerzenia. Pierwszy specjalny parametr można wyróżnić, aby nazwać jego prawdziwe znaczenie @thisnazwą. Przykład:

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
źródło
1

Jeśli użyjemy słowa kluczowego jako nazwy identyfikatora, otrzymamy błąd kompilatora: „oczekiwany identyfikator,„ nazwa identyfikatora ”jest słowem kluczowym”. Aby przezwyciężyć ten błąd, należy poprzedzić identyfikator „@”. Takie identyfikatory są dosłownie identyfikatorami. Znak @ nie jest tak naprawdę częścią identyfikatora, więc identyfikator może być postrzegany w innych językach jako normalny identyfikator, bez prefiksu

raji vineeth
źródło
1

Możesz go użyć, aby użyć zastrzeżonych słów kluczowych jako nazwy zmiennej, takiej jak

 int @int = 3; 

kompilator zignoruje @i skompiluje zmienną jakoint

używanie myśli nie jest powszechną praktyką

Mina Gabriel
źródło