Konwencja nazewnictwa C # dla stałych?

419
private const int THE_ANSWER = 42;

lub

private const int theAnswer = 42;

Osobiście uważam, że z nowoczesnymi IDE powinniśmy wybrać camelCase, ponieważ ALL_CAPS wygląda dziwnie. Co myślisz?

mmiika
źródło
4
@mmiika: co w tym przykładzie oznacza „the”? Czy to tak, jak w „Poradniku autostopowicza po galaktyce”, czy też jest przeniesione z jakiegoś standardu kodowania C ++? (Np. Stara platforma C ++ dla komputerów Macintosh, THINK C [i późniejsze Symantec C ++], użyła przedrostka „jej” dla członków wskaźnika / odniesienia i „the” dla członków skalarnych.)
Peter Mortensen
5
@Peter, ponieważ wartość stałej wynosi 42, mocno wierzę, że jest to odniesienie do Poradnika Autostopowicza po Galaktyce .
Albireo
@PeterMortensen To kreatywne! Ale nazwiska takie jak jego Pracownik i jego Klient brzmią, jakby mogły wprowadzać w błąd.
Camilo Martin
4
MSDN: Konwencje wielkich
Captain Sensible
Wolę theAnswer. Wcześniej był fanem notacji węgierskiej, ale odkąd nauczyłem się go nie używać, uwielbiam unikać meta wskazań w nazewnictwie. To samo dotyczy interfejsów takich jak IInterface. Wolę Interfacable. Ale pracując w zespole, musiałem przestrzegać zasad :(
nawfal

Odpowiedzi:

484

Zaleca się stosowanie konwencji nazewnictwa i wielkich liter P ascal C asing dla stałych (Microsoft ma narzędzie o nazwie StyleCop, które dokumentuje wszystkie preferowane konwencje i może sprawdzić źródło pod kątem zgodności - choć jest to zbyt anonimowe zachowanie dla gustów wielu osób) . na przykład

private const int TheAnswer = 42;

Konwencja pisowni wielkimi literami Pascala jest również udokumentowana w Wytycznych projektowych Microsoft Framework .

Greg Beech
źródło
51
W rzeczywistości StyleCop „nie jest produktem Microsoft”, ale „narzędziem opracowanym przez bardzo zaangażowanego programistę Microsoft (wieczorami i weekendami)”. (Szczegółowe informacje można znaleźć na blogs.msdn.com/sourceanalysis/archive/2008/07/20/... i blogs.msdn.com/bharry/archive/2008/07/19/... ). Biorąc to pod uwagę, nazwa systemu Microsoft konwencje używać Pascal Osłonka do stałych, dzięki czemu narzędzie jest tylko egzekwowanie standard, że Microsoft nie publikowania i zatwierdzić.
bdukes
12
@bdukes - nie powiedziałem, że jest to produkt Microsoft, jednak ma on całkiem spore zastosowanie i wsparcie w całej organizacji (jako były pracownik korzystałem z niego lata wcześniej, zanim ktoś spoza Microsoft go dostał, więc Jestem świadomy jej dziedzictwa).
Greg Beech
8
Nie podoba mi się to, ponieważ pierwsza litera jest zwykle używana do wskazania, czy zmienna jest widoczna z zewnątrz, czy nie. W kodzie TheAnswer wygląda dla mnie jak własność publiczna, a nie prywatna stała. W rzeczywistości wolałbym używać prefiksu takiego jak constTheAnswer i ConstTheAnswer.
Efrain
52
Wybrałbym notację TheAnswer, z wyjątkiem sytuacji, gdy wartość wynosi 42, w którym to przypadku zdecydowanie trzymałbym się metody ALL_CAPS.
Benoittr
4
Czy prywatne pole nie powinno być obudowane na wielbłądzie, a nawet jeśli jest stałe?
Markus Meyer
70

Wizualnie, wielka litera to droga. W ten sposób jest to tak rozpoznawalne. Ze względu na wyjątkowość i brak szansy na zgadywanie głosuję na UPPER_CASE!

const int THE_ANSWER = 42;

Uwaga : Wielkie litery będą przydatne, gdy stałe będą używane w tym samym pliku na górze strony i do celów inteligencji; gdyby jednak zostały przeniesione do niezależnej klasy, użycie wielkich liter nie zrobiłoby dużej różnicy, na przykład:

public static class Constant
{
    public static readonly int Cons1 = 1;
    public static readonly int coNs2 = 2;
    public static readonly int cOns3 = 3;
    public static readonly int CONS4 = 4;
}

// Call constants from anywhere
// Since the class has a unique and recognizable name, Upper Case might lose its charm
private void DoSomething(){
var getCons1 = Constant.Cons1;
var getCons2 = Constant.coNs2;
var getCons3 = Constant.cOns3;
var getCons4 = Constant.CONS4;
 }
przydatne
źródło
5
Ja też wolę to, ponieważ obudowę Pascala można łatwo pomylić z odniesieniem do właściwości.
bc3tech,
8
Niezależnie od powyższych zaleceń, wolę również UPPER_CASE dla stałych, ponieważ znacznie ułatwia to ich identyfikację w porównaniu do innych przypadków.
dub stylee
23
@usefulBee „SNAKE_CASE” jest zdecydowanie odradzane w C #; Ta odpowiedź jest zła. Poprawnym przypadkiem consts w C # jest „TitleCase”.
BrainSlugs83
13
@ BrainSlugs83, nie sądzę, że jest tu coś dobrego lub złego; sprowadza się do preferencji i tego, co czyni kod bardziej przejrzystym.
przydatneBe
2
@usefulBee Zgadzam się. Ale nadal dobrze jest zaznaczyć, jaki jest konsensus . Ostatnio robiłem mnóstwo kodu Ruby i myślę, że SCREAMING_SNAKE_CASE ma sens: to bardzo oczywiste, że jest to coś wyjątkowego i nawet nie musisz unosić kursora / przejść do definicji, aby dowiedzieć się o co chodzi. Znasz to natychmiast.
Per Lundberg
69

Właściwie to jest

private const int TheAnswer = 42;

Przynajmniej jeśli spojrzysz na bibliotekę .NET, której IMO jest najlepszym sposobem na określenie konwencji nazewnictwa - aby twój kod nie wyglądał nie na miejscu.

bh213
źródło
23

Nadal używam wielkich liter dla stałych, ale jest to bardziej z przyzwyczajenia niż z jakiegokolwiek konkretnego powodu.

Oczywiście ułatwia natychmiastowe stwierdzenie, że coś jest stałe. Pytanie do mnie brzmi: czy naprawdę potrzebujemy tych informacji? Czy pomaga nam to w jakikolwiek sposób uniknąć błędów? Jeśli przypiszę wartość do const, kompilator powie mi, że zrobiłem coś głupiego.

Mój wniosek: idź z obudową wielbłąda. Może też zmienię swój styl ;-)

Edytować:

To, że coś pachnie po węgiersku, nie jest tak naprawdę uzasadnionym argumentem, IMO. Pytanie powinno zawsze brzmieć: czy to pomaga, czy boli?

Zdarzają się przypadki, gdy węgierski pomaga. Nie tak wielu w dzisiejszych czasach, ale nadal istnieją.

Treb
źródło
30
Kod jest odczytywany znacznie częściej niż jest zapisywany. Pewnie, kiedy piszesz kod, kompilator uniemożliwi ci przypisanie do stałej. Ale co z facetem, który musi zachować twój kod za dwa lata? Na pewno miło jest móc natychmiast rozpoznać stałą.
Greg Hewgill,
2
Dzisiejsze IDE wychwytują wiele problemów przed kompilacją. Nie sądzę, aby rozpoznawanie stałej według nazwy było ważne, w przeciwnym razie nie powinieneś dodać specjalnej nazwy dla zmiennych tylko do odczytu?
mmiika
5
Jeśli się nad tym zastanowić, przyzwyczajenie wielkich liter prawdopodobnie pochodziło z makr preprocesora, a nie ze stałych (nigdy nie użyłem wielkich liter bloków dla prawdziwych stałych). W tym kontekście sensowne jest odróżnienie makr od rzeczywistego kodu, ponieważ makro może faktycznie być wyrażeniem, a nie stałą wartością, jego rozszerzenie może powodować skutki uboczne i tak dalej. Musisz więc wiedzieć, kiedy używasz makra i kiedy używasz stałej. Osobiście cieszę się z tyłu makr preprocesora, ponieważ miały one duży potencjał, aby kod był trudny do odczytania.
Tim Long
7
@Tim: Zgadzam się, ostatecznie makra preprocesora przyniosły więcej szkody niż pożytku. Moje najbardziej ulubione makro PP: „#DEFINE Private Public” ;-)
Treb
1
@Tim: C ++ standard Tempate Biblioteka przyjęła małych liter dla stałych np std :: string :: ONP ( cplusplus.com/reference/string/string/npos ). Więc ALL_CAPS dotyczy tylko makr i dyrektyw preprocesora - co sprawia, że ​​wygląda to jeszcze bardziej głupio w C #.
Richard Dingwall
16

Po pierwsze, notacja węgierska polega na stosowaniu przedrostka do wyświetlania typu danych parametru lub zamierzonego zastosowania. Konwencje nazewnictwa firmy Microsoft dotyczące odmowy notacji węgierskiej http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

Używanie wielkich liter nie jest zalecane, jak stwierdzono tutaj: Pascal Case jest akceptowalną konwencją i KRZYWKAMI. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft stwierdza również, że można użyć DUŻYCH LAS, jeśli jest to zrobione w celu dopasowania do istniejącego schematu. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

To właściwie podsumowuje.

użytkownik31939
źródło
3
Tak, notacja węgierska to nie wszystkie litery.
snibbets,
13

W artykule Stałe (Podręcznik programowania w języku C #) Microsoft podaje następujący przykład:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

W przypadku stałych wydaje się, że Microsoft zaleca użycie camelCasing. Pamiętaj jednak, że te stałe są zdefiniowane lokalnie .

Prawdopodobnie nazwanie widocznych z zewnątrz stałych jest bardziej interesujące. W praktyce Microsoft dokumentuje swoje stałe publiczne w bibliotece klas .NET jako pola . Oto kilka przykładów:

Pierwsze dwa są przykładami PascalCasing. Trzeci wydaje się być zgodny z konwencjami wielkich liter Microsoftu dla dwuliterowego akronimu (chociaż pi nie jest akryonimem). A czwarty wydaje się sugerować, że reguła dla dwuliterowego akryonimu rozciąga się na jednoliterowy akronim lub identyfikator taki jak E(który reprezentuje stałą matematyczną e ).

Ponadto w dokumencie Konwencje kapitalizacji, Microsoft bardzo bezpośrednio stwierdza, że identyfikatory pola powinno być nazwane przez PascalCasingi podaje następujące przykłady MessageQueue.InfiniteTimeout i UInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Wniosek: Użyj PascalCasingdla stałych publicznych (które są udokumentowane jako constlub static readonlypola).

Wreszcie, o ile mi wiadomo, Microsoft nie zaleca określonych konwencji nazewnictwa lub wielkich liter dla prywatnych identyfikatorów, jak pokazano w przykładach przedstawionych w pytaniu.

DavidRR
źródło
Deweloper, który napisał ten artykuł, najwyraźniej nie przestrzegał zalecanych przez Microsoft konwencji stylizacji dla C #.
BrainSlugs83
2
Artykuł wskazany w tej odpowiedzi się zmienił. Consts są teraz publiczne i zostały PascalCased. Biorąc pod uwagę obie te zmiany, nie pomaga to odpowiedzieć na pytanie, czy stałe prywatne powinny mieć wartość PascalCased czy camelCased.
Metalogic,
12

Pozostaw Węgier Węgierom.

W tym przykładzie pominąłbym nawet ostateczny artykuł i po prostu poszedłem

private const int Answer = 42;

Czy to odpowiedź, czy to odpowiedź?

* Dokonałem edycji jako Pascal ściśle poprawnej, ale myślałem, że pytanie szukało więcej odpowiedzi na życie, wszechświat i wszystko .

gołąb
źródło
2
W tym konkretnym przypadku jest to odpowiedź. Ale tylko dlatego, że tak bardzo lubię czytać D.Adamsa.
Treb
tak, ale jakie jest pytanie? i nie karm mnie tak przykro z powodu linii niedogodności;)
dove
2
Ach, ale skoro znasz już odpowiedź, nie możesz znać pytania. Są wzajemnie wykluczające się. (Założę się, że już to wiedziałeś ;-)
Treb
To jest poprawna odpowiedź na pytanie PO. - Zagłosowałbym dwa razy za usunięcie tego The, gdybym mógł. :-)
BrainSlugs83
Kim jest Węgier, czy ta odpowiedź mówi, że wolno im stosować inną konwencję?
Kapitan Prinny,
6

Właściwie wolę PascalCase tutaj - ale z przyzwyczajenia jestem winny UPPER_CASE ...

Marc Gravell
źródło
6

Uważam, że ALL_CAPS pochodzi ze sposobu pracy w C i C ++. Ten artykuł tutaj wyjaśnia, w jaki sposób różnice w stylu doszło.

W nowych IDE, takich jak Visual Studio, łatwo jest zidentyfikować typy, zakres, a jeśli są one stałe, więc nie jest to absolutnie konieczne.

Oprogramowanie FxCop i Microsoft StyleCop pomoże ci podać wytyczne i sprawdzić kod, aby wszyscy działali w ten sam sposób.

Jan
źródło