Jak nazwać swoje prywatne zmienne w C #? [Zamknięte]

25

Jaka jest najlepsza praktyka, najczęściej akceptowane konwencje nazewnictwa dla zmiennych prywatnych w języku C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Tajemnicza inna opcja

Z którego korzystasz i dlaczego? (Moja firma jest dość nowa w C # i chciałbym wybrać najbardziej akceptowaną w branży metodę, aby spróbować uzyskać dostęp do naszego standardu kodowania.)

Vaccano
źródło
Dlaczego nie skorzystać z właściwości automatycznie wdrażanych? msdn.microsoft.com/en-us/library/bb384054.aspx
Kyle Ballard
1
C # ma standardy w tym zakresie, patrz stackoverflow.com/questions/14967/...
Tamara Wijsman,
7
Nie jest miło mówić publicznie o zmiennych prywatnych. Przepraszam, po prostu musiałem.
Mark C
Używam tego samego co azheglov (m_someVariable), z wyjątkiem tego, że używam _someVariable tylko w zakresie lokalnym dla metody.
lord-fu,
7
@ Mark Myślę, że powinny to być „członkowie prywatni”, aby było to sugestywne.
EpsilonVector,

Odpowiedzi:

44

Wytyczne dotyczące projektowania klasy MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx zaleca opcję 1 - myInteger.

Zawsze używałem tego stylu. Osobiście nie lubię postaci _.

btlog
źródło
1
Nie podobało mi się to, dopóki resharper nie dodał środkowego ciągu pasującego do inteligencji. Teraz mogę pisać myIntegeri będzie pasować _myInteger. Ale nie wiedziałem, że MSDS mówi, aby nie używać _
Vaccano
4
Jeśli użyjesz opcji 1, jak mogę ustalić, czy myIntegerzmienna jest lokalna dla metody, czy jest członkiem klasy prywatnej?
Wizard79
4
@Lorenzo this.myInteger;)
TWith2Sugars
12
Ale ... „to” ma 4 znaki, a „_” to tylko jeden! Właściwie ta wytyczna ma wiele sensu, ale w moim biurze wszyscy uwielbiają podkreślenia i nie znoszą patrzeć na to „Foo” z jakiegokolwiek powodu. Czasami ważne są tylko te wytyczne, które wymusza na Tobie miejsce pracy.
CodexArcanum
2
Spór o liczbę znaków jest dyskusyjny. Nie musisz pisać za thiskażdym razem, tylko w metodach, w których występuje lokalna zmienna o tej samej nazwie. Jednak przy każdym podkreśleniu musisz napisać dodatkowy symbol. Zgadzam się z tym, że przestrzeganie umowy w stylu lokalnego kodu jest zawsze ważne.
Malcolm
25

Korzystam z opcji 4 powyżej:

private int _myInteger;

Lubię mieć pewne oznaczenie zakresu w moich nazwach zmiennych, a do tego celu wystarcza podkreślenie. Jest również dość łatwy do odczytania.

Matt Dillard
źródło
5
Nie zgadzam się, że jest łatwy do odczytania, zwłaszcza jeśli musisz operować kilkoma zmiennymi.
Restuta
15

Używam następującego schematu nazewnictwa:

  • 1st (myInteger) dla zmiennych o zasięgu lokalnym
  • 2nd (MyInteger) dla właściwości publicznych
  • 4. (_myInteger) dla zmiennych prywatnych
Zafer
źródło
14

Myślę, że opcja 4 jest naprawdę najbardziej czytelną opcją. Pomaga ci to zrobić:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Dzięki temu wszyscy członkowie prywatni są bardziej zauważalni. W poniższym przykładzie, skąd, u diabła, agepochodzi? Bez thiskwalifikatora trudniej powiedzieć.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Jest to o wiele łatwiejsze do zrozumienia:

private void Method()
{
    var x = 2;
    var y = _age + x;
}
ChaosPandion
źródło
1
Kiedyś przeklinałem na podstawie twojego pierwszego przykładu, ale po wypróbowaniu opcji nr 4 wolę używać podkreślników jako prefiksu dla pól prywatnych.
Jeremy Wiebe,
2
Mówię: użyj 1 dla zmiennych prywatnych, użyj 4 dla zmiennych prywatnych używanych we właściwościach.
Evan Plaice,
2
Muszę się nie zgodzić z ChaosPandoin. Dla mnie obie implementacje metody () są łatwe do odczytania. Gdy tylko zobaczę zmienną wiekową (lub _age) i zauważę, że nie jest zadeklarowana w metodzie, zdaję sobie sprawę, że musi być zadeklarowana gdzie indziej w klasie. Ten kwalifikator jest okropny, ale przynajmniej ogranicza się do metody konstruktora.
David Kennedy,
10

Po pierwsze, PascalCasing jest zwykle zarezerwowany dla publicznych właściwości, stałych, metod itp. Klasy. Pominąłbym więc 2 i 5.

Po drugie, notacja węgierska jest odradzana w świecie .NET, więc (tak myślę) 3 jest już dostępna. Zakładając, że tak właśnie jest z 3.

To pozostawia z camelCasing i _camelCasing. Zazwyczaj używam _camelCasing dla zmiennych klas, a zwykły stary camelCasing dla zmiennych o zakresie do metody lub węższej. Obudowa wielbłąda jest przyjętym standardem stosowanym dla argumentów metod, nazw zmiennych chronionych / prywatnych i zmiennych w ramach metody lub węższym zakresie.

Lubię też dodawać znaki podkreślenia, aby moje prywatne zmienne były zgrupowane w mojej inteligencji. Robię to jednak tylko w przypadku zmiennych o określonym typie. Zmienne zadeklarowane w ramach metody lub węższego zakresu pomijam podkreślenie. Ułatwia rozdzielenie ich i utrzymanie razem mniej używanych zmiennych.

Oszukany
źródło
2
Nie rozumiem, dlaczego miałbyś używać _camelCasing dla zmiennych klas, ponieważ zwykle jest oczywiste, że są to zmienne klas.
alternatywny
1
@ matem nie, to nie jest oczywiste w inteligencji. Pamiętaj, że pola (zmienne o zasięgu klasowym) mają (prawie) tę samą ikonę co zmienne o zasięgu metody, więc wyglądają dokładnie tak samo, jeśli nie przyjrzysz się uważnie. Podkreślenie pomaga odróżnić je wizualnie i utrzymuje je zgrupowane, co pomaga, jeśli nie używasz ich często (co nie powinno być, ponieważ stan jest wrogiem programowania bezbłędnego).
Ripped Off
Nigdy nie mówiłem nic o Intellisense. Mówię o różnicy między Color.ClassMethod () i myColor.InstanceMethod (), a mianowicie, że powinno być oczywiste, że skoro Color jest klasą, ClassMethod () jest metodą klasową.
alternatywny
@math you before: I don't understand why you would use _camelCasing for class variables you after: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Przepraszam, gdy jestem zdezorientowany. Słuchaj, rzadko używam zmiennych klas, więc miło jest przypomnieć sobie ich nazwy, naciskając _ i każąc, aby wszystkie wyskakiwały w inteligencji ładnie i pogrupowane.
Ripped Off
2
@mathepic: Kiedy Will mówi „zmienne klasowe”, ma na myśli (prywatne) pola instancji. Wydaje się, że zinterpretowałeś to, co powiedział, że oznacza statycznych członków; ale nie to powiedział.
Dan Tao
4

private int integer

Jeśli pomylisz się między zmiennymi składowymi a zmiennymi lokalnymi w zakresie metody, prawdopodobnie konieczne będzie zrefaktoryzowanie.

Ryan Roberts
źródło
+1: myślę, że o to chodzi. BTW: Widzę jego źródło, ale integermoże lepiej przerobić nazwę value?
Wolf,
2

Uważam, że najlepszym sposobem na to (w każdym razie w C # /. Net) jest kombinacja 2 i 6:

private int MyInteger { get; set; }

Teoretycznie nie ma tu żadnej zmiennej, ale wygląda i działa jak zmienna instancji prywatnej. Jeśli musimy dodać do tej wartości logikę biznesową (jest to wartość całkowicie wewnętrzna, więc możemy zrobić wszystko, co chcemy), to jest już dla nas „własność”. Gorący parowy puchar wygranej!

Zadanie
źródło
2

Robię opcję nr 4, ponieważ tak wygląda SSCLI, ale szczerze mówiąc, nie obchodzi mnie zbytnio nazywanie zmiennej prywatnej. Publiczna to inna historia.

BTW zapomniałeś m_MyInteger

Conrad Frix
źródło
2

Nie nazwałbym tego „moim” niczym!

Ale powiedziałbym

class C
{
     int VariableName { get; set; }
}

dość często jest to przyjemniejsze niż posiadanie wyraźnych zmiennych. Gdybym miał jawną zmienną prywatną, nazwałbym jąint _variableName;

CJBrew
źródło
1

W C ++ często używam _, ponieważ często zmieniam edytory, co nie pozwala mi sprawdzić, czy jest prywatny.

W przypadku C # zwykle zostawiam _, ponieważ Visual Studio pozwala mi sprawdzić, czy jest prywatny.

Zwykle używam do tego celu Camel Case.

Tamara Wijsman
źródło
1

Używam 4 ( private int _myInteger;), ponieważ:

private int myInteger;

Tak nazywam moje zmienne lokalne.

private int MyInteger;

Tak nazywam stałe.

private int mMyInteger;

To nie jest styl C #.

private int _MyInteger;

To wygląda dziwnie.

Victor Hurdugaci
źródło
1

z podkreśleniem.

Bill Wagner wyjaśnia, dlaczego w Effective C # . Ale nigdy nie nazwałbym liczby całkowitej moją liczbą całkowitą , lepiej coś takiego jak _age lub _length. Dołączanie TypeName do nazwy instancji jest okropną praktyką. Nazwy powinny być zrozumiałe, a ponieważ C # jest typem, typy można zawsze znaleźć.

Caspar Kleijne
źródło
1
Tak, to był jednak przykład.
Vaccano
1

Musisz podać bardziej konkretny przykład, ale:

private int count, private int badFileCount ,private static readonly int ReconnectAttemptsLimit

Nawiasem mówiąc, otrzymujesz to wszystko ZA DARMO, gdy instalujesz i zaczynasz korzystać z najnowszych i najlepszych MSFT Stylecop.

Praca
źródło
0

Wybieram opcję 5: private int _MyFoo

Nie widzę jednak żadnej rzeczywistej przewagi konkurencyjnej nad _myFoo.

mafu
źródło
0

Użyj camelCasing dla zmiennych prywatnych takich jak myInteger

Rozważ poprzednie, _jeśli zmienna jest kopią zapasową właściwości w celu zmniejszenia nieporozumień -
Zmienna _myPropertydla właściwościMyProperty

Gulszan
źródło
0

Mam ReSharper nazwać moje zmienne, nie tylko moje, ale wszyscy inni też to robią. Projekt zapewnia dużą spójność.

Sevki
źródło
0

Juval Lowy's IDesign C # Coding Standard jest dość popularny. Ten standard zaleca poprzedzanie zmiennych prywatnych członków znakiem „m_” (opcja 6). Tak właśnie robimy w naszym zespole.

private int m_myInteger;

Opcja 4 ( _myInteger) jest dopuszczalną odmianą tego standardu.

Nie podobało mi się zalecenie MSDN ( myInteger), ponieważ utrudnia odróżnienie członka prywatnego od zmiennej lokalnej. Ich zalecenie oczywiście rozwiązuje ten problem, kwalifikując członków prywatnych this, co wydaje mi się zbędne.

azheglov
źródło