Często spotyka się _var
nazwę zmiennej w polu klasy. Co oznacza podkreślenie? Czy istnieje odniesienie do wszystkich tych specjalnych konwencji nazewnictwa?
c#
c++
naming-conventions
Stan
źródło
źródło
Odpowiedzi:
Podkreślenie to po prostu konwencja; nic więcej. W związku z tym jego użycie jest zawsze nieco inne dla każdej osoby. Oto, jak rozumiem je w tych dwóch językach:
W C ++ podkreślenie zwykle oznacza prywatną zmienną składową.
W C # zwykle widzę, że jest używany tylko podczas definiowania podstawowej zmiennej składowej prywatnej dla właściwości publicznej. Inne zmienne składowe prywatne nie miałyby podkreślenia. To użycie w dużej mierze odeszło jednak na bok wraz z pojawieniem się automatycznych właściwości.
Przed:
Po:
źródło
public string Name { get; private set; }
. To prawda, że nie jest całkowicie niezmienny, ale istnieje._var
nie jest zastrzeżone.Najlepszą praktyką jest NIEUŻYWANIE PODNOŚNIKÓW przed jakąkolwiek nazwą zmiennej lub nazwą parametru w C ++
Nazwy zaczynające się od podkreślenia lub podwójnego podkreślenia są ZAREZERWOWANE dla osób wdrażających C ++. Nazwy z podkreśleniem są zarezerwowane dla biblioteki.
Jeśli przeczytałeś C ++ Coding Standard, zobaczysz, że na pierwszej stronie jest napisane:
Dokładniej, projekt roboczy ISO określa rzeczywiste zasady:
Najlepszą praktyką jest unikanie rozpoczynania symbolu od podkreślenia, na wypadek gdybyś przypadkowo znalazł się w jednym z powyższych ograniczeń.
Sam możesz się przekonać, dlaczego takie użycie podkreśleń może być katastrofalne w przypadku tworzenia oprogramowania:
Spróbuj skompilować prosty program helloWorld.cpp w następujący sposób:
Zobaczysz wszystko, co dzieje się w tle. Oto fragment:
Możesz zobaczyć, ile nazw zaczyna się od podwójnego podkreślenia!
Ponadto, jeśli spojrzysz na wirtualne funkcje składowe, zobaczysz, że * _vptr jest wskaźnikiem wygenerowanym dla wirtualnej tabeli, który jest automatycznie tworzony, gdy używasz jednej lub więcej wirtualnych funkcji składowych w swojej klasie! Ale to już inna historia ...
Jeśli użyjesz podkreśleń, możesz mieć problemy z konfliktem i NIE MASZ POMYSŁU, co go powoduje, dopóki nie będzie za późno.
źródło
Właściwie
_var
konwencja pochodzi z VB, a nie z C # czy C ++ (m _, ... to inna sprawa).Pozwoliło to przezwyciężyć niewrażliwość VB na wielkość liter podczas deklarowania właściwości.
Na przykład, taki kod nie jest możliwe w VB, ponieważ uważa,
user
iUser
jako taki sam identyfikatorAby temu zaradzić, niektórzy używali konwencji dodawania „_” do pola prywatnego, aby uzyskać taki efekt
Ponieważ wiele konwencji dotyczy .Net i aby zachować pewną jednolitość między konwencjami C # i VB.NET, używają one tej samej.
Znalazłem odniesienie do tego, co mówiłem: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
źródło
Pierwszy komentator (R Samuel Klatchko) wspomniał: Jakie są zasady dotyczące używania podkreślenia w identyfikatorze C ++? który odpowiada na pytanie o podkreślenie w C ++. Ogólnie rzecz biorąc, nie powinieneś używać początkowego podkreślenia, ponieważ jest on zarezerwowany dla implementującego twój kompilator. Kod, z którym widzisz,
_var
jest prawdopodobnie kodem starszym lub kodem napisanym przez kogoś, kto dorastał przy użyciu starego systemu nazewnictwa, który nie marszczył brwi na widok wiodących znaków podkreślenia.Jak podają inne odpowiedzi, był używany w C ++ do identyfikowania zmiennych składowych klasy. Jednak nie ma to specjalnego znaczenia, jeśli chodzi o dekoratory lub składnię. Więc jeśli chcesz go użyć, skompiluje się.
Zostawię dyskusję C # innym.
źródło
_var nie ma znaczenia i służy jedynie do ułatwienia rozróżnienia, że zmienna jest prywatną zmienną składową.
W C ++ używanie konwencji _var jest złą formą, ponieważ istnieją reguły regulujące użycie znaku podkreślenia przed identyfikatorem. _var jest zarezerwowany jako identyfikator globalny, podczas gdy _Var (podkreślenie + duża litera) jest zarezerwowany w dowolnym momencie. Dlatego w C ++ zobaczysz ludzi używających konwencji var_.
źródło
Możesz stworzyć własne wytyczne dotyczące kodowania. Po prostu napisz jasną dokumentację dla reszty zespołu.
Użycie _field pomaga Intelilsense w filtrowaniu wszystkich zmiennych klas po prostu wpisując _.
Zwykle postępuję zgodnie z wytycznymi Brada Adamsa , ale odradzam używanie podkreślenia.
źródło
Nazewnictwie standardem Microsoft C # mówi zmienne i parametry powinny stosować małe liter wielbłąd tj
paramName
. Norma wymaga również pola podążać taką samą formę, ale może to prowadzić do kodu niejasnej tak wiele zespołów wezwać do prefiksu podkreślenia, aby poprawić jasność tj_fieldName
.źródło
W przypadku języka C # wytyczne dotyczące projektu Microsoft Framework sugerują, aby nie używać znaku podkreślenia dla członków publicznych . W przypadku członków prywatnych podkreślenia są dopuszczalne. W rzeczywistości Jeffrey Richter (często cytowany w wytycznych) używa na przykład m_ i „s_” dla prywatnych statycznych członków.
Osobiście używam tylko _ do oznaczania moich prywatnych członków. „m_” i „s_” graniczą z notacją węgierską, która jest nie tylko mile widziana w .NET, ale może być dość rozwlekła i uważam, że klasy z wieloma członkami są trudne do wykonania szybkiego skanowania oczu alfabetycznie (wyobraź sobie 10 zmiennych, wszystkie zaczynające się od m_) .
źródło
Używam nazewnictwa _var dla zmiennych składowych moich klas. Są dwa główne powody, dla których robię:
1) Pomaga mi śledzić zmienne klasowe i lokalne zmienne funkcyjne podczas późniejszego czytania kodu.
2) Pomaga w Intellisense (lub innym systemie uzupełniania kodu), gdy szukam zmiennej klasy. Znajomość pierwszego znaku jest pomocna w przefiltrowaniu listy dostępnych zmiennych i metod.
źródło
Jeśli chodzi o języki C i C ++, podkreślenie w nazwie nie ma specjalnego znaczenia (początek, środek lub koniec). To tylko prawidłowy znak nazwy zmiennej. „Konwencje” pochodzą z praktyk kodowania w ramach społeczności programistów.
Jak już wskazano w różnych przykładach powyżej, _ na początku może oznaczać prywatnych lub chronionych członków klasy w C ++.
Podam tylko historię, która może być zabawną ciekawostką. W systemie UNIX, jeśli masz podstawową funkcję biblioteki C i zaplecze jądra, w którym chcesz udostępnić funkcję jądra w przestrzeni użytkownika, znak _ utknie przed funkcją pośredniczącą funkcji, która bezpośrednio wywołuje funkcję jądra, nie robiąc nic innego. Najbardziej znanym i znanym przykładem tego jest exit () vs _exit () w jądrach typu BSD i SysV: Tutaj exit () wykonuje operacje w przestrzeni użytkownika przed wywołaniem usługi wyjścia jądra, podczas gdy _exit po prostu mapuje na usługę wyjścia jądra.
Tak więc _ zostało użyte dla rzeczy „lokalnych”, w tym przypadku lokalnie lokalna dla maszyny. Zazwyczaj funkcja _functions () nie była przenośna. W związku z tym nie należy oczekiwać takiego samego zachowania na różnych platformach.
Teraz co do _ w nazwach zmiennych, takich jak
int _foo;
Z psychologicznego punktu widzenia _ jest dziwną rzeczą, którą trzeba wpisywać na początku. Więc jeśli chcesz utworzyć nazwę zmiennej, która miałaby mniejsze szanse na kolizję z czymś innym, SZCZEGÓLNIE w przypadku zastępowania preprocesorów, które chcesz, rozważ użycie _.
Moja podstawowa rada jest taka, aby zawsze postępować zgodnie z konwencją Twojej społeczności programistów, aby móc efektywniej współpracować.
źródło
Oznacza to po prostu, że jest to pole składowe w klasie.
źródło
Nie ma żadnej konkretnej konwencji nazewnictwa, ale widziałem to w przypadku prywatnych członków.
źródło
Wiele osób lubi mieć prywatne pola poprzedzone podkreśleniem. To tylko konwencja nazewnictwa.
„Oficjalne” konwencje nazewnictwa języka C # nakazują proste nazwy małymi literami (bez podkreślenia) dla pól prywatnych.
Nie znam standardowych konwencji C ++, chociaż podkreślenia są bardzo szeroko stosowane.
źródło
Jest to po prostu konwencja, której niektórzy programiści używają, aby wyjaśnić, kiedy manipulujesz składnikiem klasy lub jakimś innym rodzajem zmiennej (parametrami, lokalnymi dla funkcji itp.). Inną konwencją, która jest również szeroko stosowana w przypadku zmiennych składowych, jest poprzedzanie nazwy przedrostkiem „m_”.
Zresztą to tylko konwencje i nie znajdziesz dla nich jednego źródła. Są kwestią stylu, a każdy zespół programistyczny, projekt czy firma ma swój własny (a nawet go nie ma).
źródło
Jest w pełni uzasadniony powód, aby używać go w C #: jeśli kod musi być również rozszerzalny z VB.NET. (W przeciwnym razie nie zrobiłbym tego.)
Ponieważ VB.NET nie rozróżnia wielkości liter, nie ma prostego sposobu na uzyskanie dostępu do chronionego
field
elementu członkowskiego w tym kodzie:Np. Uzyska dostęp do metody pobierania właściwości, a nie pola:
Heck, nie mogę nawet pisać
field
małymi literami - VS 2010 po prostu ciągle to poprawia.Aby uczynić go łatwo dostępnym dla klas pochodnych w VB.NET, trzeba wymyślić inną konwencję nazewnictwa. Przedrostek podkreślenia jest prawdopodobnie najmniej uciążliwym i najbardziej „historycznie akceptowanym” z nich.
źródło
Teraz notacja używająca "this" jak w this.foobarbaz jest akceptowalna dla zmiennych składowych klasy C #. Zastępuje starą notację „m_” lub po prostu „__”. Czyni to kod bardziej czytelnym, ponieważ nie ma wątpliwości, co jest referencją.
źródło
Z mojego doświadczenia (z pewnością ograniczonego) podkreślenie będzie wskazywać, że jest to prywatna zmienna składowa. Jak powiedział Gollum, będzie to jednak zależeć od zespołu.
źródło
Stare pytanie, nowa odpowiedź (C #).
Innym zastosowaniem podkreślenia dla C # jest użycie DI (iniekcja zależności) ASP NET Core. Prywatne
readonly
zmienne klasy, która została przypisana do wstrzykniętego interfejsu podczas budowy, powinny zaczynać się od podkreślenia. Wydaje mi się, że jest to debata, czy użyć podkreślenia dla każdego prywatnego członka klasy (chociaż sam Microsoft podąża za tym), ale ten jest pewien.źródło
Taka konwencja nazewnictwa jest przydatna podczas czytania kodu, zwłaszcza kodu, który nie jest Twoim własnym. Silna konwencja nazewnictwa pomaga wskazać, gdzie jest zdefiniowany dany członek, jakiego rodzaju jest to członek, itp. Większość zespołów programistów przyjmuje prostą konwencję nazewnictwa i po prostu umieszcza przed polami elementu podkreślenie (
_fieldName
). W przeszłości stosowałem następującą konwencję nazewnictwa dla języka C # (która jest oparta na konwencji Microsoftu dla kodu platformy .NET, którą można zobaczyć w programie Reflector):Pole instancji: m_fieldName
Pole statyczne: s_fieldName
Public / Protected / Internal Member: PascalCasedName ()
Private Member: camelCasedName ()
Pomaga to ludziom bardzo szybko zrozumieć strukturę, użycie, dostępność i lokalizację członków podczas czytania nieznanego kodu.
źródło