C # -Namenskonvention für Konstanten?

419
private const int THE_ANSWER = 42;

oder

private const int theAnswer = 42;

Persönlich denke ich, dass wir mit modernen IDEs mit camelCase arbeiten sollten, da ALL_CAPS seltsam aussieht. Was denken Sie?

mmiika
quelle
4
@mmiika: Was bedeutet "das" in diesem Beispiel? Ist es wie in "Per Anhalter durch die Galaxis" oder wird es von einem C ++ - Codierungsstandard übernommen? (ZB ein altes C ++ - Framework für Macintosh, THINK C [und später Symantec C ++], verwendete das Präfix "its" für Zeiger- / Referenzelemente und "the" für skalare Elemente.)
Peter Mortensen
5
@Peter, da der Wert der Konstante 42 ist, glaube ich fest daran, dass es sich um einen Verweis auf den Per Anhalter durch die Galaxis handelt .
Albireo
@PeterMortensen Das ist kreativ! Namen wie itsEmployee und itsCostumer klingen jedoch irreführend.
Camilo Martin
4
MSDN: Kapitalisierungskonventionen msdn.microsoft.com/en-us/library/vstudio/ms229043(v=vs.90).aspx
Captain Sensible
Ich bevorzuge theAnswer. Früher war ich ein ungarischer Notationsfan, aber seit ich gelernt habe, es nicht zu benutzen, liebe ich es, Metaangaben bei der Benennung strikt zu vermeiden. Gleiches gilt für Schnittstellen wie IInterface. Ich bevorzuge Interfacable. Aber wenn ich in einem Team arbeite, muss ich die Regeln einhalten :(
nawfal

Antworten:

484

Die empfohlene Namens- und Großschreibungskonvention besteht darin, P ascal C asing für Konstanten zu verwenden (Microsoft verfügt über ein Tool namens StyleCop , das alle bevorzugten Konventionen dokumentiert und Ihre Quelle auf Konformität überprüfen kann - obwohl es für den Geschmack vieler Menschen etwas zu anal ist). . z.B

private const int TheAnswer = 42;

Die Pascal-Großschreibungskonvention ist auch in den Framework Design Guidelines von Microsoft dokumentiert .

Greg Beech
quelle
51
Eigentlich ist StyleCop "kein Microsoft-Produkt", sondern "ein Tool, das von einem sehr leidenschaftlichen Entwickler bei Microsoft (abends und am Wochenende) entwickelt wurde". (Weitere Informationen finden Sie unter blogs.msdn.com/sourceanalysis/archive/2008/07/20/… und blogs.msdn.com/bharry/archive/2008/07/19/… .) Konventionen für Konstanten Pascal Gehäuse, so dass das Werkzeug nur ist die Standard - Durchsetzung , dass Microsoft nicht veröffentlichen und billigen.
Bdukes
12
@bdukes - Ich habe nicht gesagt, dass es sich um ein Microsoft-Produkt handelt, es wird jedoch im gesamten Unternehmen viel genutzt und unterstützt (als ehemaliger Mitarbeiter habe ich es Jahre verwendet, bevor jemand außerhalb von Microsoft es in die Hände bekam Ich bin mir seines Erbes bewusst.
Greg Beech
8
Das gefällt mir nicht, weil der erste Buchstabe normalerweise verwendet wird, um anzugeben, ob eine Variable von außen sichtbar ist oder nicht. Im Code sieht TheAnswer für mich wie eine öffentliche Eigenschaft aus, nicht wie eine private Konstante. Eigentlich würde ich lieber ein Präfix wie constTheAnswer und ConstTheAnswer verwenden.
Efrain
52
Ich würde mit der TheAnswer-Notation gehen, außer wenn der Wert 42 ist. In diesem Fall würde ich definitiv beim ALL_CAPS-Ansatz bleiben.
Benoittr
4
Sollte ein privates Feld nicht in Kamelhülle gelegt werden, Ereignis, wenn es const ist?
Markus Meyer
70

Optisch ist Großbuchstaben der richtige Weg. Es ist so erkennbar. Aus Gründen der Einzigartigkeit und ohne die Möglichkeit zu raten, stimme ich für UPPER_CASE!

const int THE_ANSWER = 42;

Hinweis : Der Großbuchstabe ist nützlich, wenn Konstanten in derselben Datei oben auf der Seite und für Intellisense-Zwecke verwendet werden sollen. Wenn sie jedoch in eine unabhängige Klasse verschoben würden, würde die Verwendung von Großbuchstaben als Beispiel keinen großen Unterschied machen:

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;
 }
nützlichBee
quelle
5
Auch ich bevorzuge dies, da das Pascal-Gehäuse leicht mit einer Eigenschaftsreferenz verwechselt werden kann.
bc3tech
8
Unabhängig von den obigen Empfehlungen bevorzuge ich UPPER_CASE auch für Konstanten, da sie im Vergleich zu anderen Fällen viel einfacher zu identifizieren sind.
Dub Stylee
23
@usefulBee "SNAKE_CASE" wird in C # dringend empfohlen. Diese Antwort ist falsch. Der korrekte Fall für consts in C # ist "TitleCase".
BrainSlugs83
13
@ BrainSlugs83, ich glaube nicht, dass es hier richtig oder falsch gibt; Es kommt auf die Vorlieben an und darauf, was den Code klarer macht.
nützlichBee
2
@usefulBee Zustimmen. Aber es ist immer noch gut zu markieren, wie man es im Konsens schreibt. Ich habe in letzter Zeit eine Menge Ruby-Code erstellt, und ich denke, dass SCREAMING_SNAKE_CASE Sinn macht: Es ist sehr offensichtlich, dass es etwas Besonderes ist, und Sie müssen nicht einmal schweben / Zur Definition gehen, um herauszufinden, worum es geht. Sie wissen es sofort.
Per Lundberg
69

Eigentlich ist es so

private const int TheAnswer = 42;

Zumindest wenn Sie sich die .NET-Bibliothek ansehen, welche IMO der beste Weg ist, um Namenskonventionen zu bestimmen - damit Ihr Code nicht fehl am Platz aussieht.

bh213
quelle
23

Ich gehe immer noch mit dem Großbuchstaben für konstante Werte, aber dies ist eher aus Gewohnheit als aus irgendeinem bestimmten Grund.

Natürlich macht es leicht, sofort zu erkennen, dass etwas eine Konstante ist. Die Frage an mich ist: Brauchen wir diese Informationen wirklich? Hilft es uns in irgendeiner Weise, Fehler zu vermeiden? Wenn ich der Konstante einen Wert zuweise, sagt mir der Compiler, dass ich etwas Dummes getan habe.

Mein Fazit: Geh mit der Kamelhülle. Vielleicht ändere ich auch meinen Stil ;-)

Bearbeiten:

Dass etwas ungarisch riecht, ist kein wirklich gültiges Argument, IMO. Die Frage sollte immer sein: Hilft es oder tut es weh?

Es gibt Fälle, in denen Ungarisch hilft. Nicht so viele heutzutage, aber sie existieren immer noch.

Treb
quelle
30
Code wird viel häufiger gelesen als geschrieben. Sicher, wenn Sie den Code schreiben, verhindert der Compiler, dass Sie einer Konstanten zuweisen. Aber was ist mit dem Typ, der Ihren Code in zwei Jahren warten muss? Es ist sicher schön, eine Konstante sofort erkennen zu können.
Greg Hewgill
2
Die IDEs von heute haben vor der Kompilierung viele Probleme. Ich denke nicht, dass es wichtig ist, eine Konstante anhand ihres Namens zu erkennen. Andernfalls sollten Sie nicht auch einen speziellen Namen für schreibgeschützte Variablen hinzufügen.
mmiika
5
Wenn Sie darüber nachdenken, stammt das Habbit in Großbuchstaben wahrscheinlich eher von Präprozessor-Makros als von Konstanten (ich habe nie Block Caps für echte Konstanten verwendet). In diesem Zusammenhang ist es sinnvoll, die Makros vom eigentlichen Code zu unterscheiden, da ein Makro tatsächlich ein Ausdruck und kein konstanter Wert sein kann, seine Erweiterung Nebenwirkungen verursachen kann und so weiter. Sie müssen also wissen, wann Sie ein Makro verwenden und wann Sie eine Konstante verwenden. Ich persönlich bin froh, die Rückseite der Präprozessor-Makros zu sehen. Sie hatten viel Potenzial, Code schwer lesbar zu machen.
Tim Long
7
@ Tim: Ich stimme zu, am Ende haben Präprozessor-Makros mehr Schaden als Nutzen gebracht. Mein Lieblings-PP-Makro: "#DEFINE Private Public" ;-)
Treb
1
@Tim: Die C ++ Standard Tempate Library hat Kleinbuchstaben für Konstanten übernommen, z. B. std :: string :: npos ( cplusplus.com/reference/string/string/npos ). ALL_CAPS ist also nur für Makros und Präprozessor-Direktiven gedacht, wodurch es in C # noch dümmer aussieht.
Richard Dingwall
16

Erstens ist die ungarische Notation die Praxis, ein Präfix zu verwenden, um den Datentyp oder die beabsichtigte Verwendung eines Parameters anzuzeigen. Die Namenskonventionen von Microsoft für sagen Nein zur ungarischen Notation http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

Die Verwendung von UPPERCASE wird nicht empfohlen, wie hier angegeben: Pascal Case ist die akzeptable Konvention und SCREAMING CAPS. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft gibt hier auch an, dass UPPERCASE verwendet werden kann, wenn dies dem vorhandenen Schema entspricht. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

Das fasst es ziemlich gut zusammen.

user31939
quelle
3
Ja, die ungarische Notation besteht nicht nur aus Großbuchstaben.
Snibbets
13

In seinem Artikel Konstanten (C # -Programmierhandbuch) gibt Microsoft das folgende Beispiel an:

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;
}

Für Konstanten scheint Microsoft die Verwendung von zu empfehlen camelCasing. Beachten Sie jedoch, dass diese Konstanten lokal definiert sind .

Die Benennung von extern sichtbaren Konstanten ist wohl von größerem Interesse. In der Praxis dokumentiert Microsoft seine öffentlichen Konstanten in der .NET-Klassenbibliothek als Felder . Hier sind einige Beispiele:

Die ersten beiden sind Beispiele für PascalCasing. Das dritte scheint den Kapitalisierungskonventionen von Microsoft für ein aus zwei Buchstaben bestehendes Akronym zu folgen (obwohl pi kein Akronym ist). Und der vierte scheint darauf hinzudeuten, dass sich die Regel für ein aus zwei Buchstaben bestehendes Acryonym auf ein einzelnes Buchstaben-Akronym oder einen Bezeichner wie E(der die mathematische Konstante e darstellt ) erstreckt.

Darüber hinaus gibt Microsoft in seinem Dokument "Kapitalisierungskonventionen" sehr direkt an, dass Feldkennungen über benannt werden sollen, PascalCasingund gibt die folgenden Beispiele für MessageQueue.InfiniteTimeout und UInt32.Min an :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Schlussfolgerung: Verwendung PascalCasingfür öffentliche Konstanten (die als constoder static readonlyFelder dokumentiert sind).

Schließlich befürwortet Microsoft meines Wissens keine spezifischen Namens- oder Großschreibungskonventionen für private Kennungen, wie in den in der Frage dargestellten Beispielen gezeigt.

DavidRR
quelle
Der Entwickler, der diesen Artikel geschrieben hat, hat die von Microsoft empfohlenen Styling-Konventionen für C # eindeutig nicht befolgt.
BrainSlugs83
2
Der Artikel, auf den diese Antwort verweist, hat sich geändert. Die consts sind jetzt öffentlich und wurden PascalCased. Angesichts dieser beiden Änderungen hilft dies nicht bei der Beantwortung der Frage, ob private Konstanten PascalCased oder camelCased sein sollen.
Metalogic
12

Überlassen Sie Ungarisch den Ungarn.

Im Beispiel würde ich sogar den endgültigen Artikel weglassen und einfach mitmachen

private const int Answer = 42;

Ist das die Antwort oder ist das die Antwort?

* Bearbeiten als Pascal streng korrekt gemacht, aber ich dachte, die Frage suchte eher nach einer Antwort auf das Leben, das Universum und alles .

Taube
quelle
2
In diesem speziellen Fall ist es die Antwort. Aber nur, weil ich D.Adams so gerne lese.
Treb
Ja, aber was ist die Frage? und füttere mich nicht so leid für die Unannehmlichkeiten Linie;)
Taube
2
Ah, aber da Sie die Antwort bereits kennen, können Sie die Frage nicht kennen. Sie schließen sich gegenseitig aus. (
Ich
Dies ist die richtige Antwort auf die Frage des OP. - Ich würde dich zweimal dafür stimmen, dass du das entfernt hast, Thewenn ich könnte. :-)
BrainSlugs83
Was ist jemand, der ungarisch ist? Sagt diese Antwort, dass er die andere Konvention anwenden darf?
Kapitän Prinny
6

Eigentlich bevorzuge ich hier PascalCase - aber aus Gewohnheit bin ich an UPPER_CASE schuld ...

Marc Gravell
quelle
6

Das ALL_CAPS stammt aus der C- und C ++ - Arbeitsweise, glaube ich. Dieser Artikel hier erklärt, wie die Stilunterschiede entstanden sind.

In den neuen IDEs wie Visual Studio ist es einfach, die Typen, den Umfang und die Konstanten zu identifizieren, sodass dies nicht unbedingt erforderlich ist.

Mit der FxCop- und Microsoft StyleCop- Software erhalten Sie Richtlinien und können Ihren Code überprüfen, damit alle auf die gleiche Weise arbeiten.

John
quelle