Może nas czasami najść ochota na nazwanie jakieś zmiennej czy klasy słowem kluczowym, zarezerwowanym w C#. Standardowa deklaracja, taka jak ta:
1: public class class 2: { 3: 4: }
zakończy sie błędem kompilacji.
Rozwiązaniem problemu jest wstawienie małpy przed danym identyfikatorem… i już możemy nazywać wszystko jak nam się żywnie podoba:
1: public class @class 2: { 3: 4: }
A potem słowo class bez małpy będzie oznaczało to, co normalnie oznacza, czy naszą klasę? Jeśli to, co zwykle, to czy można pisać _class zamiast @class? Albo stosować inny dozwolony znak jako przedrostek?
Czy nazywanie klasy tak jak element składni nie jest błędem zaburzającym czytelność kodu? Po co to robić?
@mt3o:
Na poziomie C# odwołujemy się do takiego elementu tak samo jak go zadeklarowaliśmy, z @. Można stosować jakikolwiek inny przedrostek, z tą różnicą, że identyfikatory z małpą (czyli np. ‘@class’) na poziomie IL są już widoczne jako identyfikatory bez małpy (czyli normalnie ‘class’) – można sobie to obejrzeć Reflectorem.
Pytanie "po co to robić" jest jak najbardziej słuszne:). W sumie to ciekawostka, która niekoniecznie musi się przydać w przyszłości.
Ja używam tego tylko w jednym scenariuszu: ApplicationEvents. Podczas opisywania mechanizmu (tutaj: http://www.maciejaniserowicz.com/post/2009/09/07/Application-Events.aspx ) zamieniłem "@event" na "e", ale w kodzie parametr reprezentujący zdarzenie nazywam właśnie "@event". Jeśli miałbym to usprawiedliwić w jakiś racjonalny sposób to bym nie potrafił, tak po prostu zrobiłem.
Przykład z @event to także jedyna sytuacja, w którym ja stosuję małpkę poprzedzając nazwę. W innym przypadku poprzedzanie słów kluczowych @ nie ma chyba sensu.
Pozdrawiam,
Paweł
tylko po co to?
chyba jeszcze do integracji z projektami w innych językach:
kod VB.NET:
Imports System.Windows.Forms
Public Class Class1
Public Sub bealed()
MessageBox.Show("bealed")
End Sub
Public Sub sealed()
MessageBox.Show("sealed")
End Sub
End Class
wywołujący kod C#:
private static void tester()
{
ClassLibrary1.Class1 c = new ClassLibrary1.Class1();
c.bealed();
c.@sealed();
}
Po co to? Ano naprzyklad po to:
<%=Html.TextBoxFor(x => x.Name, new { @class = "text", maxlength = 200 })%>
No i jest odpowiedź "po co" – dzięki, sam się czegoś dowiedziałem :).