Podkreślanie lub nie podkreślanie - oto jest pytanie


132

Czy są jakieś problemy z nieprzedrostowaniem pól prywatnych z podkreśleniem w C #, jeśli wersja binarna ma być używana przez inne języki ramowe? Na przykład, ponieważ C # rozróżnia wielkość liter, możesz wywołać pole „foo” i właściwość publiczną „Foo” i działa dobrze.

Czy miałoby to jakikolwiek wpływ na język bez rozróżniania wielkości liter, taki jak VB.NET, czy wystąpią jakiekolwiek problemy ze zgodnością ze specyfikacją CLS (lub innymi), jeśli nazwy można rozróżnić tylko po wielkości liter?


19
Celem przedrostka podkreślenia, BTW, nie jest rozwiązywanie problemów. Ma to na celu łatwe i wizualne rozróżnianie pól i miejscowych podczas czytania kodu. Użyję go zarówno w C #, jak i VB.
Neil Hewitt,

2
@NeilHewitt: Cóż, zapobiega to również konfliktom parametrów funkcji ze zmiennymi składowymi, które wymagają poprzedzenia każdej z nich this, co jest do bani. EDYCJA: Właśnie odpowiedziałem na komentarz
sprzed

Dla jasności oficjalnym standardem jest _camelCase(preferowany tylko do odczytu) github.com/dotnet/corefx/blob/master/Documentation/…
Chris

Preferuję _camelCase dla prywatnych sklepów wspierających. tj .: prywatne pole, które zawiera dane przypisane i dostępne za pośrednictwem właściwości. Nie lubię właściwości automatycznych, ponieważ nie można ich zainicjować ze znaną wartością w definicji klasy, a jeśli chcę mieć efekt uboczny w programie ustawiającym, potrzebuję jawnie zadeklarowanego magazynu zapasowego. Niestety, jest to refaktoryzowane, gdy używam ^ R ^ E w edytorze c #, więc muszę dodawać to z powrotem ... za każdym razem.
TomXP411

Odpowiedzi:


47

Nie przyniesie to żadnego efektu.

Część zaleceń do pisania bibliotek zgodnych z systemem CLS jest nie mieć dwa publicznych / chronione podmioty, które różnią się tylko wielkością liter, np powinieneś nie mieć

public void foo() {...}

i

public void Foo() {...}

to, co opisujesz, nie stanowi problemu, ponieważ element prywatny nie jest dostępny dla użytkownika biblioteki


1
Chociaż nie przyniesie to żadnego efektu, to nadal jest to konwencja, z którą nie czułbym się komfortowo - ponieważ jest to przepis na zamieszanie, jeśli różnią się one tylko przypadkiem. Po prostu zbyt łatwo jest błędnie odczytać lub błędnie wpisać, jeśli jedyną różnicą jest kapitał początkowy.
ChrisA

2
PS Osobiście nie podkreślam w C #. Dla mnie to osobiste preferencje, a nie przekonania religijne
Binary Worrier

1
Zrobiłem obie strony i chciałem podjąć decyzję, jeden na zawsze, w oparciu o wiedzę: P
TheCodeJunkie

47
Używam podkreślenia. Łatwiej je odróżnić od argumentów i zmiennych lokalnych.
Rinat Abdullin

4
Używam _ tylko dla pól prywatnych, jednak prawie nigdy nie mam pól prywatnych ze względu na właściwość automatyczną 3.5. Generalnie jedyny przypadek, w którym mam pole prywatne, to zaimplementowanie leniwego ładowania na typach innych niż pierwotne.
Chris Marisic

285

WAŻNA AKTUALIZACJA (12 kwietnia 2016):

Zwrócono nam uwagę, że wewnętrzny standard zespołu .NET CoreFX kładzie nacisk na używanie notacji podkreślenia bez podania przyczyny. Jednak jeśli przyjrzymy się bliżej Zasada # 3 staje się oczywiste, że nie jest to system _, t_, s_przedrostków, które sugeruje, dlaczego _został wybrany w pierwszej kolejności.

  1. Używamy _camelCasedo pól wewnętrznych i prywatnych i używamy tylko do odczytu, jeśli to możliwe. Przedrostki pól instancji za pomocą _, pola statyczne z polami statycznymi s_i łącz je za pomocą t_. Przy stosowaniu na polach statycznych, readonlypowinny pochodzić po static(czyli static readonlyniereadonly static ).
  2. Unikamy, this.chyba że jest to absolutnie konieczne.

Więc jeśli jesteś jak zespół .NET CoreFX pracujący nad jakimś krytycznym dla wydajności, wielowątkowym kodem na poziomie systemu , to MOCNIE SUGEROWANE jest, że:

  • przestrzegać ich standardów kodowania i
  • użyj notacji podkreślenia i
  • nie czytaj dalej tej odpowiedzi

W przeciwnym razie czytaj dalej ...

ORYGINALNA ODPOWIEDŹ:

Najpierw ustalmy, o czym mówimy. Pytanie brzmi, w jaki sposób uzyskujemy dostęp do elementów członkowskich instancji z metod niestatycznych i konstruktorów klasy / podklas, jeśli pozwalają na to modyfikatory widoczności.

Notacja z podkreśleniem

  • sugeruje użycie przedrostka „_” w nazwach pól prywatnych
  • mówi też, że nigdy nie powinieneś używać „tego”, chyba że jest to absolutnie konieczne

Ten zapis

  • sugeruje, aby zawsze używać „tego”. aby uzyskać dostęp do dowolnego członka instancji

Dlaczego istnieje ta notacja?

Ponieważ tak właśnie jest

  • odróżniają parametr od pola, gdy mają tę samą nazwę
  • upewnij się, że pracujesz w kontekście bieżącej instancji

Przykład

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

Dlaczego istnieje notacja podkreślenia?

Niektórzy ludzie nie lubią wpisywać „to”, ale nadal potrzebują sposobu na odróżnienie pola od parametru, więc zgodzili się użyć znaku „_” przed polem

Przykład

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

Można by pomyśleć, że to kwestia osobistego gustu, a oba sposoby są równie dobre / złe. Istnieją jednak pewne aspekty, w których ten zapis jest lepszy od znaku podkreślenia:

Przejrzystość

  • znaki podkreślenia zaśmiecają nazwy
  • ten zapis utrzymuje nazwy w stanie nienaruszonym

Ładunek kognitywny

  • podkreślenie-notacja jest niespójna, sprawia, że ​​traktujesz pola w specjalny sposób, ale nie możesz go używać z innymi członkami, za każdym razem, gdy musisz zadać sobie pytanie, czy potrzebujesz właściwości lub pola

  • ten zapis jest spójny, nie musisz myśleć, po prostu zawsze używasz „tego” w odniesieniu do dowolnego członka

AKTUALIZACJA: jak wskazano, poniższe nie są zaletą

Konserwacja

  • podkreślenie-notacja wymaga _zwrócenia uwagi podczas refaktoryzacji, powiedzmy, że zmienisz pole we właściwości (usuń _) lub odwrotnie (dodaj _)

  • ta notacja nie ma takiego problemu

Autouzupełnianie

Kiedy chcesz zobaczyć listę członków instancji:

  • notacja podkreślenia nie pomaga zbytnio, ponieważ po wpisaniu „_” wyskakujące okienko autouzupełniania pokazuje pola prywatne i wszystkie typy dostępne w połączonych zestawach zmieszane z pozostałymi członkami instancji
  • ta notacja daje jasną odpowiedź, wpisując „to” widzisz tylko listę członków i nic więcej

Dwuznaczność

Czasami masz do czynienia z kodem bez pomocy Intellisense. Na przykład, gdy przeglądasz kod lub przeglądasz kod źródłowy online.

  • podkreślenie-notacja jest niejednoznaczne: kiedy widzisz Something.SomethingElse, nie możesz stwierdzić, czy Something jest klasą, a SomethingElse jest jego statyczną właściwością ... lub może Something jest bieżącą właściwością instancji, która ma własną właściwość SomethingElse

  • ta notacja jest jasna: Kiedy widzisz Something.SomethingElse, może to oznaczać tylko klasę z właściwością statyczną, a kiedy widzisz this.Something.SomethingElse, wiesz, że Something jest składnikiem, a SomethingElse jest jego własnością

Metody rozszerzające

Nie możesz używać metod rozszerzeń w samej instancji bez użycia „this”.

  • podkreślenie-notacja wymaga, abyś nie używał "this", jednak z metodami rozszerzającymi musisz
  • ta notacja chroni cię przed wahaniem, zawsze używasz „tego”, kropka.

Obsługa programu Visual Studio

  • podkreślenie notacji nie ma wbudowanej obsługi w programie Visual Studio
  • ta notacja jest oczywiście obsługiwana przez Visual Studio:

    1. "To." Kwalifikacja : preferuj, aby wszystkie pola niestatyczne używane w metodach niestatycznych były poprzedzone this.w języku C #

Oficjalne rekomendacje

Istnieje wiele oficjalnych wskazówek, które wyraźnie mówią „nie używaj podkreśleń”, zwłaszcza w języku C #


23
To niesamowita odpowiedź. Dziękujemy za poświęcenie czasu na zebranie wszystkich tych informacji.
Tigran

5
Nie pochodzi z C ++, ponieważ w C ++ rezerwuje identyfikatory zaczynające się od podkreślenia dla użycia języka i biblioteki standardowej.
Rob G

8
Dlaczego rozróżniacie między kodem krytycznym dla wydajności, kodem wielowątkowym na poziomie systemu i innym kodem? W jaki sposób użycie _camelCasemoże mi pomóc, jeśli mój kod ma krytyczne znaczenie dla wydajności / kod na poziomie systemu?
BornToCode

8
Używanie podkreślenia nie ma nic wspólnego z pisaniem kodu krytycznego dla wydajności, wielowątkowego lub na poziomie systemu. Liczy się konsekwencja, a zespół CoreFX to tylko zespół, który zgodził się na konkretną konwencję. To świetna odpowiedź, poparta bardzo dobrą analizą porównującą konwencje nazewnictwa, ale uważam, że dodana część mówiąca, że ​​„podkreślenia są lepsze, ponieważ tak twierdzi zespół CoreFX”, naprawdę obniża jego jakość.
Şafak Gür

5
Mój problem polega na tym, że rozumiem wnioskowanie logiczne. en.wikipedia.org/wiki/Inference Ale hej, rozumiem, że to nie jest dla wszystkich.
user603563

68

Zaczerpnięte z pliku pomocy Microsoft StyleCop:

TypeName: FieldNamesMustNotBeginWithUnderscore

Identyfikator kontrolny: SA1309

Przyczyna: nazwa pola w C # zaczyna się od podkreślenia.

Opis reguły:

Naruszenie tej reguły ma miejsce, gdy nazwa pola zaczyna się od podkreślenia.

Domyślnie StyleCop nie zezwala na używanie podkreśleń, m_ itp. Do oznaczania pól klas lokalnych, na rzecz opcji „this”. prefiks. Zaleta używania „this”. polega na tym, że dotyczy to w równym stopniu wszystkich typów elementów, w tym metod, właściwości itp., a nie tylko pól, dzięki czemu wszystkie wywołania członków klas są natychmiast rozpoznawalne, niezależnie od tego, który edytor jest używany do przeglądania kodu. Kolejną zaletą jest to, że tworzy szybkie, rozpoznawalne rozróżnienie między składowymi instancji a elementami statycznymi, które nie będą poprzedzone prefiksem.

Jeśli nazwa pola lub zmiennej ma odpowiadać nazwie elementu skojarzonego z Win32 lub COM i dlatego musi zaczynać się od podkreślenia, umieść pole lub zmienną w specjalnej klasie NativeMethods. Klasa NativeMethods to dowolna klasa, która zawiera nazwę kończącą się na NativeMethods i jest przeznaczona jako symbol zastępczy dla opakowań Win32 lub COM. StyleCop zignoruje to naruszenie, jeśli element zostanie umieszczony w klasie NativeMethods.

Inny opis reguły wskazuje, że preferowaną praktyką oprócz powyższego jest rozpoczynanie pól prywatnych małymi literami, a publicznych dużymi.

Edycja: W ramach kontynuacji strona projektu StyleCop znajduje się tutaj: https://github.com/DotNetAnalyzers/StyleCopAnalyzers . Przeczytanie pliku pomocy daje wiele informacji na temat tego, dlaczego sugerują różne zasady stylistyczne.


7
Jest to głównie coś w rodzaju „najlepszych praktyk”. Zgodnie z regułą, prefiks „this” może być zastosowany do dowolnego niestatycznego elementu członkowskiego, podczas gdy prefiks z czymkolwiek innym może nie mieć zastosowania ze względu na zasady składni języka. Słowo kluczowe „this” sprawia, że ​​zamierzone miejsce docelowe jest trywialne.
Scott Dorman

5
Przedkładam również zamierzone w języku rozwiązanie problemu („to”) niż sztuczne sposoby obejścia tego problemu.
galaktor

10
W tym samym oprogramowaniu jest również reguła, która mówi, że nie powinno się mieć dwóch pól różniących się tylko wielkością liter. Więc co zrobić z chronioną zmienną opakowaną przez właściwość publiczną?
Lilith River

5
Moim jedynym problemem z „bez podkreślenia” jest to, że podczas programowania w formularzu (internetowym) lub podobnym, użycie tylko „this” nie pomaga mi w ogóle filtrować do tych prywatnych pól, które zdefiniowałem, a zamiast tego po prostu daje mi gigantyczna lista ośmiu milionów innych dóbr zawartych w tym obiekcie.

15
Wydaje się, że StyleCop mówi, że jeśli konsekwentnie używam w thisodniesieniu do dowolnego członka klasy, mogę znaleźć wszystkie wywołania do wszystkich członków klasy, po prostu wyszukując this. Nie mogę się z tym kłócić, ale nie przychodzi mi do głowy moment, w którym musiałbym to zrobić. Ostatnią rzeczą, którą chcę zrobić, jest dodanie nudy do kodowania i zaśmiecanie mojego kodu this(który jest prawie węgierski), prawie bez praktycznych korzyści. Faktem jest, że jeśli patrzę na wiersz kodu, wszystko, co zaczyna się od dużej litery lub podkreślenia, jest członkiem klasy, wszystko, co małe litery jest lokalne.
devuxer

27

Ponieważ mówimy o polu prywatnym, nie ma to wpływu na użytkownika Twojej klasy.

Ale polecam użycie podkreślenia w polu prywatnym, ponieważ może to ułatwić zrozumienie kodu, np .:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

W naszym zespole zawsze używamy przedrostka podkreślenia dla pól prywatnych. Dlatego czytając kod, mogę bardzo łatwo zidentyfikować pola prywatne i odróżnić je od lokalnych i argumentów. W pewnym sensie podkreślenie może być postrzegane jako skrócona wersja „tego”.


14
Cóż, zawsze poprzedzam „to”, bez względu na to, czy korzystam z pola, właściwości czy metody.
TheCodeJunkie

9
Dla mnie podkreślenie jest swego rodzaju skróconym zapisem „tego”.
M4N

2
W R # radzimy nie wywoływać parametru foo. Dlaczego nie nazwać tego „wartością”, skoro wiesz, że będzie ona używana do ustawiania Foo?
pomyśl przed kodowaniem

17
@Martin: Problem z podkreśleniem jako skrótem dla „this” polega na tym, że niekoniecznie można go zastosować do wszystkich członków klasy, podczas gdy „this” może. Myślę, że kod jest znacznie łatwiejszy / czystszy dzięki słowu kluczowemu „this”. W twoim przykładzie if (foo == x) będzie zawsze odnosić się do parametru foo.
Scott Dorman

3
@TheCodeJunkie: To cała masa zbędnych znaków w twoim kodzie.
Ed S.

18

Po pracy w środowisku, które od tego czasu rządziło się bardzo specyficznymi i bezsensownymi zasadami stylu, zacząłem tworzyć własny styl. To jest jeden typ, który przerzucałem w tę iz powrotem na wiele. Ostatecznie zdecydowałem, że prywatne pola zawsze będą _field, zmienne lokalne nigdy nie będą miały _ i będą pisane małymi literami, nazwy zmiennych dla kontrolek będą luźno zgodne z notacją węgierską, a parametrami będą ogólnie camelCase.

this.Moim zdaniem nienawidzę słowa kluczowego, które po prostu dodaje zbyt dużo szumu w kodzie. Uwielbiam Resharper's usuń to zbędne. słowo kluczowe.

Aktualizacja 6-letnia: analizowałem wewnętrzne elementy pod Dictionary<TKey,T>kątem określonego wykorzystania równoczesnego dostępu i błędnie odczytałem pole prywatne jako zmienną lokalną. Pola prywatne z pewnością nie powinny mieć tej samej konwencji nazewnictwa, co zmienne lokalne. Gdyby było podkreślenie, byłoby to niezwykle oczywiste.


18
Słowo thiskluczowe jest gwarantowanym odniesieniem do bieżącego obiektu. Nie dostaniesz tego z podkreśleniem. Nie ma się czego brzydzić this.
Jason S

16
Po co wymyślać „standard”. 'to.' informuje, że obiekt jest zmienną instancji „Klasa”. mówi, że jest to zmienna klasowa. Wszystko inne jest zmienną stosu. Podkreślenie należy do tego samego stosu złych pomysłów, na którym obecnie rozkłada się notacja węgierska.
Quarkly,

5
@ DRAirey1 zbyt łatwo to przegapić. kiedy tego potrzebujesz i robisz dziwne rzeczy ze stanem.
Chris Marisic,

4
@ChrisMarisic Możesz oczywiście przedstawić swoją opinię na temat korzystania z usługi _, ale nie traktuj jej jako ustalonego standardu, jeśli wyraźnie tak nie jest.
zmiażdżyć

3
Straciłem cię w "Zacząłem tworzyć swój własny styl".
rory.ap

15

Podoba mi się podkreślenie, ponieważ wtedy mogę użyć nazwy małej litery jako parametrów metody w następujący sposób:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

40
public string FirstName {get; zestaw prywatny; }
jason

3
Nadal można używać małych liter jako parametru metody, używając thissłowa kluczowego. To wyciszenie w trwającym i zawsze kontrowersyjnym „podkreślaniu czy nie”:public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
To przyszłość, tylko teraz, public string FirstName { get; }a rozgrywający jest nadal dostępny w konstruktorze
Chris Marisic

W tym przykładzie. thisbyłoby konieczne tylko w konstruktorze. Nie musisz go używać nigdzie indziej. A więc firstNamenazwa pola działa bardzo dobrze.
Thomas Eyde

10

Nadal bardzo lubię używać podkreśleń przed polami prywatnymi z powodu, o którym wspomniał Martin, a także dlatego, że pola prywatne będą następnie sortowane razem w IntelliSense. Dzieje się tak pomimo zła węgierskich notacji przedrostków w ogóle.

Jednak ostatnio stwierdzam, że używanie przedrostka podkreślenia w przypadku prywatnych członków jest źle widziane, chociaż nie jestem do końca pewien, dlaczego. Może ktoś inny wie? Czy to tylko zasada przedrostka? A może było coś związanego z zniekształcaniem nazw typów ogólnych, które uzyskują w nich podkreślenia w skompilowanych zespołach, czy coś?


4
Dla mnie _ zaśmieca _słowa podczas szybkiego _ przeszukiwania kodu, staje się mniej jak zwykłe czytanie _ i _ bardziej _ przypomina konieczność zatrzymywania się na _ każdym _, aby to potwierdzić i _ uświadomić sobie, że _nie jest to znak kontrolny jakiegoś _sortowania. Zakłóca również wcięcia, praktycznie przesuwając pierwszy użyteczny znak w nazwach pól o jedną kolumnę w prawo. Generalnie nie lubię C ++, ponieważ większość programistów C ++ ma tendencję do pisania niewiarygodnie zwięzłego i powolnego do odczytu kodu symbolicznego / maszynowego, a ja po prostu wolę nie mieć tego w kodzie C # :)
Oskar Duveborn

25
Dla mnie to. zaśmieca this.words, gdy szybko this.sanuje kod, staje się mniej podobne do czytania tego. i tego. więcej. jak konieczność zatrzymywania się i tego. uznać to i to. uświadomić sobie, że to jest. nie jest to znak kontrolny jakiegoś this.sort. O wiele wolałbym znaleźć okazjonalne _fieldFoolub _fieldBarzaśmiecać moje użycie this.fieldFoolub this.fieldBar. Uważam, że this.przedrostek jest znacznie bardziej irytujący niż wiodący znak podkreślenia.
AggieEric,

Myślałem, że może ta rozbieżność w doświadczeniu może wynikać z oldschoolowych systemów plików lub protokołów przesyłania plików, w których spacje nie były dozwolone, co przeszkoliło niektórych użytkowników w postrzeganiu podkreśleń jako spacji, a zatem nie rozpraszających ich czytania. Ja z drugiej strony mam problemy z takimi nazwami plików, ponieważ zawsze używałem spacji we własnych nazwach od początku ...
Oskar Duveborn

2
@AggieEric trafił tam w sedno. Już samo czytanie jego zdania przyprawia mnie o ból głowy! Przez lata starałem się trzymać zalecenia stwardnienia rozsianego w tej sprawie i dostałem tak CHOROBY z czytania thiswszędzie małych niebieskich słów, że podjąłem wściekłą decyzję. Teraz religijnie używam thisTYLKO odwołań do właściwości lub gdy muszę wyraźnie rozróżnić między thisi base. Chyba każdy do siebie :-)
Riegardt Steyn

1
Myślę, że dzieje się tak dlatego, że ostatecznie rozpoczynanie czegokolwiek od znaku interpunkcyjnego szkodzi czytelności. Wydaje się, że nie wszystkim to przeszkadza, ale wydaje mi się, że czytanie wszystkiego, co zaczyna się od interpunkcji, jest bardzo nienaturalne. Im bardziej kod jest podobny do angielskiego, tym łatwiej go czytać. A w przypadku nowoczesnych IDE łatwo jest odróżnić lokalnych od prywatnych członków, ponieważ najprawdopodobniej będą mieli różne kolory.
Tim Long

7

Jeśli chcesz, abyś zagłębił się w .NET Framework w stylu rekomendacji gliniarza, pokazuje, że zmienne składowe są często używane przez „_”. Cokolwiek zalecają twórcy Style Cop, to nie jest to, czego używa większość pracowników MS. :) Więc będę się trzymał podkreślenia. Ponieważ osobiście popełniam znacznie mniej błędów, używając podkreślenia niż this (przykład: używając varName = varName zamiast this.varName = varName, naprawdę tkwi we mnie)


3
Podkreślenie jest również zalecane w przewodniku po stylach
landoncz

3

Myślę, że ogólnie rzecz biorąc pola na poziomie klasowym są błędem w projektowaniu języka. Wolałbym, żeby właściwości C # miały swój własny zakres lokalny:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

Umożliwiłoby to całkowite zaprzestanie używania pól.

Jedyny przypadek, w którym poprzedzam pole prywatne znakiem podkreślenia, ma miejsce, gdy właściwość wymaga oddzielnego pola zapasowego. To też jedyny raz, kiedy korzystam z pól prywatnych. (A ponieważ nigdy nie używam pól chronionych, wewnętrznych ani publicznych, to jedyny przypadek, w którym używam okresu pól.) Jeśli o mnie chodzi, jeśli zmienna musi mieć zasięg klasy, jest to własność klasy.


Wygląda na to, że gang C # zgadza się z tobą z nowym prywatnym int foo {get; set;} syntax sugar.
Dana

Oh, pewnie; bez tego to, co tu opisuję, jest całkowicie niewykonalne.
Robert Rossney,

To, co opisujesz, to „Właściwości zaimplementowane automatycznie”. Niestety, w Visual Basic.NET, ta faktycznie używa "ukrytej" zmiennej _prefix za kulisami, tj. Jeśli masz automatycznie zaimplementowaną właściwość "Public Property Foo As Integer", wtedy NIE możesz mieć deklaracji zmiennej składowej "Private _foo as Integer ”

Nie, nie opisuję właściwości zaimplementowanych automatycznie, przynajmniej nie w moim przykładzie. Opisuję poziom zakresu, który nie istnieje w C # lub VB. To naprawdę niefortunne, że VB wybrał tak trywialny sposób na podbicie nazw pól bazowych. Język C # jest na tyle brzydki, że nigdy przez przypadek nie utworzysz zmiennej o tej samej nazwie.
Robert Rossney

2

Zapis _fieldName dla pól prywatnych jest tak łatwy do złamania . Używając „tego”. notacji nie da się złamać. Jak przerwałbyś _ notację? Przestrzegać:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Proszę bardzo, właśnie naruszyłem twoją konwencję nazewnictwa, ale się kompiluje. Wolałbym mieć konwencję nazewnictwa, która a) nie jest węgierska ib) wyraźna. Jestem zwolennikiem zniesienia węgierskiego nazewnictwa i to w pewnym sensie się kwalifikuje. Zamiast typu obiektu przed nazwą zmiennej masz jej poziom dostępu.

Porównaj to z Rubim, gdzie nazwa zmiennej @my_number wiąże nazwę z zakresem i jest nierozerwalna.

edycja: ta odpowiedź stała się negatywna. Nie obchodzi mnie to, zostaje.


14
Nie jest uzasadnioną krytyką konwencji nazewnictwa stwierdzenie, że programiści mogą jej nie przestrzegać.
Robert Rossney

10
Wow, Twoja definicja „łatwego do złamania” i moja to kompletne przeciwieństwa. Twój oznacza „łatwe do celowego złamania”, podczas gdy większość innych osób prawdopodobnie ma na myśli „łatwe do przypadkowego złamania ”. Zostawię to jako ćwiczenie dla czytelnika, aby dowiedzieć się, który z nich jest bardziej odpowiedni do pisania czytelnego kodu…
Konrad Rudolph,

8
@Konrad: Brzmisz pretensjonalnie, kiedy mówisz „jako ćwiczenie dla czytelnika”. To nie jest podręcznik do matematyki.
jcollum

3
Nieco mniej negatywnie teraz :) Chociaż możemy wiosłować pod prąd, nie lubię też konwencji podkreślenia. Moim zdaniem nie różni się od notacji węgierskiej i szczerze mówiąc, powoduje krwawienie oczu (szkodzi czytelności). Wyrzuciliśmy notację węgierską z C # i nadszedł czas, aby usunąć ostatni ślad braku zaufania do swojego IDE.
Tim Long

1
Słyszałem, że MS faktycznie mówi, że podkreślenie nie ma być używane w jego przewodniku po stylu C #. blogs.msdn.microsoft.com/brada/2005/01/26/ ... - sekcja 2.6 - wygląda na to, że Brad Abrams przynajmniej się z nami zgadza!
jcollum

1

Jeśli chcesz, aby zestaw był zgodny z CLS, możesz użyć atrybutu CLSCompliant w pliku informacji o zespole. Kompilator będzie wtedy narzekał, gdy Twój kod zawiera elementy niezgodne z CLS.

Następnie, gdy masz 2 właściwości, które różnią się tylko wielkością liter, kompilator wyświetli błąd. Z drugiej strony, jeśli masz pole prywatne i własność publiczną w tej samej klasie, nie będzie problemów.

(Ale zawsze zawsze poprzedzam moich prywatnych członków podkreśleniem. Pomaga mi to również w zrozumieniu, kiedy czytam kod, że dana zmienna jest polem członkowskim).


0

Lubię używać podkreśleń przed moimi prywatnymi polami z dwóch powodów. Wspomniano już o tym, że pola wyróżniają się na podstawie powiązanych z nimi właściwości w kodzie i Intellisense. Drugim powodem jest to, że mogę używać tych samych konwencji nazewnictwa, niezależnie od tego, czy koduję w VB, czy C #.


1
whoah, czy to mądre? Czy podkreślenie nie oznacza „kontynuuj w następnej linii” w VB?
JBRWilkinson,

1
Tylko jeśli po podkreśleniu następuje spacja.
Rob Windsor

Pierwsza litera będąca małą lub
dużą

0

Nie ma żadnych implikacji. Podczas kompilacji kodu wszystko, co jest ważne dla kompilatora, to przestrzeń nazw i widoczność pola / właściwości. Podkreślenie jest tak samo ważne, jak każdy inny znak podczas nadawania nazwy identyfikatorowi. Prawdziwą sztuczką jest użycie konwencji, którą zrozumiesz ty i ludzie wokół ciebie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.