Konwencja nazewnicza-podkreślenie w zmiennych C ++ i C #
Zwykle nazwa zmiennej
_varbędzie widoczna w polu klasy. Co oznacza podkreślenie? Czy istnieje odniesienie do wszystkich tych specjalnych konwencji nazewnictwa?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
19 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
W C ++ znak podkreślenia zwykle wskazuje 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 będą miały podkreślenia. Jednak wraz z pojawieniem się automatycznych właściwości, to zastosowanie w dużej mierze zniknęło w tle.
Przed:
Po:
Anonimowy użytkownik
Potwierdzenie od:
Najlepszym rozwiązaniem jest NIEUŻYWANIE PODNOŚNIKÓW przed nazwą zmiennej lub nazwą parametru w C ++
Nazwy zaczynające się od podkreślenia lub podwójnego podkreślenia są ZAREZERWOWANE dla programistów C ++. Podkreślone nazwy są zarezerwowane do obsługi biblioteki.
Jeśli przeczytasz standard kodowania C ++, zobaczysz, że na pierwszej stronie jest napisane:
„Nie przeciążaj konwencji nazewnictwa, ale używaj spójnej konwencji nazewnictwa: wymagane są tylko dwie opcje: a) nigdy nie używaj„ podstępnych nazw ”, które zaczynają się od podkreślenia lub zawierają podwójne podkreślenie;” (p2, Standardy kodowania C ++, Herb Sutter i Andrei Alexandrescu)
Bardziej szczegółowo,
w wersji roboczej
http://www.open-std.org/jtc1/s ... 6.pdf
ISO określa aktualne zasady:
Ponadto niektóre identyfikatory są zarezerwowane do użytku przez implementacje C ++ i nie powinny być używane w inny sposób; nie jest wymagana diagnostyka. (a) każdy identyfikator zawierający podwójny podkreślnik __ lub rozpoczynający się od podkreślenia, po którym następuje duża litera, jest zastrzeżony do implementacji w jakimkolwiek celu. (b) każdy identyfikator zaczynający się od podkreślenia jest implementacją zarezerwowaną do użytku jako nazwa w globalnej przestrzeni nazw.
Najlepiej nie zaczynać znaku od podkreślenia, jeśli przypadkowo napotkasz jedno z powyższych ograniczeń.
Możesz zobaczyć, dlaczego takie użycie podkreśleń może mieć katastrofalne skutki w tworzeniu 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 generowanym do wirtualnej tabeli, która jest tworzona automatycznie, 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 napotkać problemy związane z konfliktem i nie będziesz wiedział, co je powoduje, dopóki nie będzie za późno.
Anonimowy użytkownik
Potwierdzenie od:
Doprowadziło to do przezwyciężenia niewrażliwości VB na wielkość liter podczas deklarowania właściwości.
Na przykład taki kod nie jest możliwy w VB, ponieważ traktuje i jako ten sam identyfikator
Aby temu zaradzić, niektórzy zastosowali konwencję dodawania „_” do pola prywatnego, aby wyglądało to tak
Ponieważ wiele konwencji dotyczy .Net i aby zachować pewną spójność między konwencjami C # i VB.NET, używają tego samego.
Znalazłem link do tego, o czym mówiłem:
http://10rem.net/articles/net- ... tices
http://10rem.net/articles/net- ... Wielbłądowe etui z wiodącym podkreśleniem. W
VB.NET zawsze określa „Chroniony” lub
„Prywatne”, nie używaj „Przyciemnij”. Za pomocą
„m_” jest przestarzałe, podobnie jak użycie
nazwa zmiennej inna niż
właściwości tylko w przypadku, zwłaszcza z
chronione zmienne, ponieważ narusza
zgodność i uczyni twoje życie
bolesne, jeśli programujesz w VB.NET, ponieważ ty
muszą wymieniać swoich członków
coś innego niż właściwości
dostęp/mutator. Ze wszystkich
akapity tutaj, prowadząc podkreślenie
są rzeczywiście jedynymi kontrowersyjnymi.
Osobiście wolę to reżyserować
obudowa wielbłąda bez podkreślenia dla mojego
zmienne prywatne, więc tego nie robię
musisz kwalifikować nazwy zmiennych za pomocą „this”.
aby odróżnić je od parametrów w
konstruktorzy lub gdziekolwiek indziej, gdzie mam
prawdopodobnie dojdzie do kolizji nazw.
W przypadku VB.NET niewrażliwych na wielkość liter jest
nawet ważniejsze, ponieważ Twój
właściwości dostępu zwykle mają
to samo, co Twój prywatny członek
zmienne z wyjątkiem podkreślenia.
Jeśli chodzi o m_, tak naprawdę to tylko
o estetyce. Ja (i wielu innych)
znajdź m_ brzydki, jak to wygląda
że w nazwie zmiennej jest dziura. to
prawie obraźliwe. Użyłem go w
VB6 cały czas, ale tylko
ponieważ zmienne nie mogły mieć
początkowe podkreślenie. Nie mogłem
szczęśliwszy, że wychodzi. Microsoft
odradza używanie m_ (i
prosto _), chociaż zrobili i
oba w swoim kodzie. Przedrostek z
bezpośrednie „m” jest poprawne. Oczywiście,
ponieważ są one głównie kodowane w C #, mogą
mają tylko członków prywatnych, którzy się różnią
jeśli różnią się od właściwości. Ludzie
muszę zrobić coś innego. Zamiast
próbując wymyślić
język po języku w szczególnych przypadkach i
polecam początkowe podkreślenie dla
wszystkich języków, które będą go obsługiwać. Jeśli
chcę, aby moja klasa była kompletna
Zgodny z CLS, mogłem wyjść
prefiks dla każdego chronionego
Zmienne składowe C #. W praktyce jednak ja
nigdy się tym nie martw, bo wszystko zachowuję
potencjalnie chronione zmienne składowe
prywatne i zamiast tego chronione dostawy
akcesory i mutatory. Dlaczego?:
Krótko mówiąc, jest to umowa
prosty (jeden znak), łatwy do odczytania
(Twój wzrok nie jest rozpraszany przez innych
wiodące postacie) i pomyślnie
unika kolizji nazw z
zmienne na poziomie procedury i
właściwości na poziomie klasy.
Anonimowy użytkownik
Potwierdzenie od:
jakie są zasady używania podkreślenia w identyfikatorze C ++?
https://coderoad.ru/228783/
który odpowiada na pytanie o podkreślenie w C ++. Generalnie nie powinieneś używać początkowego podkreślenia, ponieważ jest on zarezerwowany dla programisty kompilatora. Kod, który widzisz za pomocą , jest prawdopodobnie kodem starszego typu lub kodem napisanym przez kogoś, kto dorastał przy użyciu starego systemu nazewnictwa, który nie nachmurzył się, gdy chodziło o podkreślenia.
Jak podają inne odpowiedzi, był używany w C ++ do identyfikowania zmiennych składowych klasy. Jednak tak naprawdę nie ma to znaczenia dla dekoratorów lub składni. Dlatego jeśli chcesz go użyć, skompiluje się.
Zostawię dyskusję o C # innym.
Anonimowy użytkownik
Potwierdzenie od:
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 zawsze zarezerwowany. Dlatego w C ++ zobaczysz ludzi używających konwencji var_.
Anonimowy użytkownik
Potwierdzenie od:
Użycie _field pomaga Intelilsense filtrować wszystkie zmienne klas, po prostu wpisując _.
Zwykle podążam
Zalecenia Brada Adamsa
http://blogs.msdn.com/b/brada/ ... .aspx, ale odradza używanie podkreśleń.
Anonimowy użytkownik
Potwierdzenie od:
IE:
. Standard wymaga również, aby pola miały ten sam formularz, ale może to prowadzić do rozmytego kodu, dlatego wiele poleceń wymaga podkreślenia przedrostka, aby poprawić przejrzystość
IE:
.
Anonimowy użytkownik
Potwierdzenie od:
Framework Design Guidelines
https://rads.stackoverflow.com ... 46756
sugeruje, aby nie używać podkreślenia dla
otwarty
członków. Dla
prywatny
znaki podkreślenia są używane przez OK. Tak właściwie
Jeffrey Richter
http://www.wintellect.com/cs/b ... .aspx
(często cytowane w podręczniku) używa na przykład m_ i A „s_” dla prywatnych statycznych członków.
Osobiście używam znaku _ tylko w odniesieniu do moich osobistych członków. „m_” i „s_” ograniczają się do notacji węgierskiej, która nie tylko jest mile widziana w .NET, ale może być dość rozwlekła, a dla klas z wieloma członkami trudno jest szybko przejrzeć oczy w kolejności alfabetycznej (wyobraź sobie 10 zmiennych zaczynających się od m_ ).
Anonimowy użytkownik
Potwierdzenie od:
1) pomaga mi śledzić zmienne klasowe i funkcjonalne zmienne lokalne podczas późniejszego czytania kodu.
2) pomaga w Intellisense (lub innym systemie uzupełniania kodu), gdy szukam zmiennej klasy. Znajomość pierwszego znaku jest przydatna do filtrowania listy dostępnych zmiennych i metod.
Anonimowy użytkownik
Potwierdzenie od:
Jak wskazano w różnych przykładach powyżej, znak _ na początku może oznaczać prywatnych lub chronionych członków klasy w C ++.
Pozwólcie, że opowiem wam tylko krótką historię, która może być zabawną rzeczą. W systemie UNIX, jeśli masz główną funkcję biblioteki C i zaplecze jądra, w którym chcesz udostępnić funkcję jądra również przestrzeni użytkownika, _ utknie przed funkcją pośredniczącą, która bezpośrednio wywołuje funkcję jądra, nie robiąc nic innego. Najbardziej znanym i znanym przykładem tego jest exit () kontra _exit () w jądrach BSD i SysV: tam exit () działa w przestrzeni użytkownika przed wywołaniem usługi wyjścia jądra, podczas gdy _exit jest po prostu mapowane na usługę wyjścia jądra.
Więc _ było używane dla rzeczy "lokalnych", w tym przypadku lokalna była lokalna dla maszyny. Zwykle funkcja _functions () nie była przenośna. W takim przypadku nie należy oczekiwać takiego samego zachowania na różnych platformach.
Teraz co do _ w nazwach zmiennych, takich jak
int _foo;
Cóż, z psychologicznego punktu widzenia, wpisywanie _ jest dziwne na samym początku. Więc jeśli chcesz utworzyć nazwę zmiennej, która z mniejszym prawdopodobieństwem koliduje z czymś innym, ZWŁASZCZA podczas wymiany preprocesora, powinieneś rozważyć użycie _.
Moja główna rada brzmi: zawsze przestrzegaj konwencji swojej społeczności programistów, aby móc efektywniej współpracować.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
„Oficjalne” konwencje nazewnictwa języka C # narzucają proste nazwy małymi literami (bez podkreślenia) dla pól prywatnych.
Nie znam standardowych konwencji C ++, chociaż podkreślenia są bardzo szeroko stosowane.
Anonimowy użytkownik
Potwierdzenie od:
Zresztą to tylko konwencje i nie znajdziesz dla nich jednego źródła. To kwestia stylu, a każdy zespół programistyczny, projekt lub firma ma swój (a nawet nie).
Anonimowy użytkownik
Potwierdzenie od:
https://connect.microsoft.com/ ... in1.0
jeśli kod również musi być rozszerzalny z VB.NET.
(W przeciwnym razie nie zrobiłbym tego.)
Ponieważ VB.NET nie rozróżnia wielkości liter, w tym kodzie nie ma łatwego sposobu na uzyskanie dostępu do chronionego elementu :
Na przykład. spowoduje to dostęp do właściwości pobierającej, a nie pola:
Heck, nie mogę nawet napisać małymi literami - VS 2010 po prostu to naprawia.
Aby była łatwo dostępna dla klas pochodnych w VB.NET, musisz wymyślić inną konwencję nazewnictwa. Przedrostek podkreślenia jest prawdopodobnie najmniej inwazyjny i najbardziej „historycznie akceptowany” z nich.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Innym zastosowaniem podkreślenia dla C # jest użycie ASP NET Core DI (iniekcja zależności). Prywatne zmienne klasy , które zostały przypisane do wprowadzonego interfejsu w czasie kompilacji, muszą zaczynać się od podkreślenia. Wydaje mi się, że jest to dyskusja o tym, czy używać podkreślenia dla każdego prywatnego członka klasy (chociaż sam Microsoft podąża za tym), ale jest to określone.
Anonimowy użytkownik
Potwierdzenie od:
Pole instancji:
m_fieldName
Pole statyczne:
s_fieldName
Członek publiczny/chroniony/wewnętrzny:
PascalCasedName()
Członek prywatny:
camelCasedName()
Pomaga ludziom bardzo szybko zrozumieć strukturę, użycie, dostępność i układ elementów podczas czytania nieznanego kodu.