Stellen Sie sich vor, ich habe die folgende Aufzählung definiert:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Was ist die beste Vorgehensweise bei der Verwendung von Enum? Sollte es 1
wie im obigen Beispiel beginnen oder mit 0
(ohne die expliziten Werte) wie folgt beginnen:
public enum Status : byte
{
Inactive,
Active
}
Antworten:
Richtlinien für das Framework-Design :
Framework Design Guidelines / Designing Flag Enums :
quelle
switch
Anweisungen springt er zu demdefault
Abschnitt, in den ich a werfeInvalidEnumArgumentException
. Andernfalls wird ein Programm möglicherweise unbeabsichtigt mit dem Nullwert einer Aufzählung weiter ausgeführt, was gültig sein und unbemerkt bleiben kann.Nun, ich glaube, ich bin mit den meisten Antworten nicht einverstanden, die besagen, sie nicht explizit zu nummerieren. Ich nummeriere sie immer explizit, aber das liegt daran, dass ich sie in den meisten Fällen in einem Datenstrom speichere, in dem sie als ganzzahliger Wert gespeichert sind. Wenn Sie die Werte nicht explizit hinzufügen und dann einen neuen Wert hinzufügen, können Sie die Serialisierung unterbrechen und dann alte persistierte Objekte nicht genau laden. Wenn Sie diese Werte dauerhaft speichern möchten, würde ich dringend empfehlen, die Werte explizit festzulegen.
quelle
Eine Aufzählung ist ein Werttyp und ihr Standardwert (z. B. für ein Aufzählungsfeld in einer Klasse) ist 0, wenn er nicht explizit initialisiert wird.
Daher möchten Sie im Allgemeinen 0 als definierte Konstante haben (z. B. Unbekannt).
Wenn Sie in Ihrem Beispiel
Inactive
die Standardeinstellung sein möchten , sollte sie den Wert Null haben. Andernfalls sollten Sie eine Konstante hinzufügenUnknown
.Einige Leute haben empfohlen, dass Sie keine expliziten Werte für Ihre Konstanten angeben. Wahrscheinlich in den meisten Fällen ein guter Rat, aber es gibt einige Fälle, in denen Sie dies tun möchten:
Flaggen Aufzählungen
Aufzählungen, deren Werte im Interop mit externen Systemen (z. B. COM) verwendet werden.
quelle
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
ist viel besser lesbar als[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
würde z. B. dazu führen[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, während Sie für eine Flags-Aufzählung normalerweise C = 4 wünschen würden.Wenn Sie keinen bestimmten Grund haben, dies zu ändern, lassen Sie die Aufzählungen mit ihren Standardwerten, die bei Null beginnen.
quelle
Ich würde sagen, die beste Vorgehensweise ist, sie nicht zu nummerieren und implizit zu lassen - was bei 0 beginnen würde. Da es implizit ist, ist es die Sprachpräferenz, die immer gut zu befolgen ist :)
quelle
Ich würde eine Aufzählung vom Typ Boolean mit einer 0 beginnen.
Es sei denn, "Inative" bedeutet etwas anderes als "Inaktiv" :)
Dies behält den Standard für diese bei.
quelle
Ich würde sagen, es hängt davon ab, wie Sie sie verwenden. Für das Markieren von Enum ist es eine gute Praxis, 0 für den
None
Wert zu haben , wie folgt :Wenn Ihre Aufzählung wahrscheinlich einer Datenbank-Nachschlagetabelle zugeordnet wird, würde ich sie mit 1 beginnen. Für professionell geschriebenen Code sollte dies nicht viel bedeuten, dies verbessert jedoch die Lesbarkeit.
In anderen Fällen würde ich es so lassen, wie es ist, ohne darauf zu achten, ob sie mit 0 oder 1 beginnen.
quelle
Sofern Sie keinen guten Grund haben, die Rohwerte zu verwenden, sollten Sie immer nur implizite Werte verwenden und diese mit
Status.Active
und referenzierenStatus.Inactive
.Der Haken ist, dass Sie möglicherweise Daten in einer Flatfile oder DB speichern oder eine Flatfile oder DB verwenden möchten, die von einer anderen Person erstellt wurde. Wenn Sie es selbst machen, machen Sie es so, dass die Nummerierung zu dem passt, wofür die Aufzählung verwendet wird.
Wenn die Daten nicht Ihnen gehören, möchten Sie natürlich alles verwenden, was der ursprüngliche Entwickler als Nummerierungsschema verwendet hat.
Wenn Sie die Aufzählung als Flaggensatz verwenden möchten, gibt es eine einfache Konvention, die es wert ist, befolgt zu werden:
Die Werte sollten Zweierpotenzen sein und können mit Bitverschiebungsoperationen ausgedrückt werden.
None
sollte natürlich sein0
, ist aberAll
weniger offensichtlich-1
.~0
ist die binäre Negation von0
und führt zu einer Zahl, auf die jedes Bit gesetzt ist1
, was einen Wert von darstellt-1
. Für zusammengesetzte Flags (häufig zur Vereinfachung verwendet) können andere Werte mit dem bitweisen Operator oder dem Operator zusammengeführt werden|
.quelle
Weisen Sie keine Nummern zu. Verwenden Sie es einfach so, wie es verwendet werden soll.
quelle
Wenn nicht angegeben, beginnt die Nummerierung bei 0.
Es ist wichtig, explizit zu sein, da Aufzählungen häufig serialisiert und als int und nicht als Zeichenfolge gespeichert werden.
Für jede in der Datenbank gespeicherte Aufzählung nummerieren wir die Optionen immer explizit, um eine Verschiebung und Neuzuweisung während der Wartung zu verhindern.
Laut Microsoft wird empfohlen, die erste Nulloption zu verwenden, um einen nicht initialisierten oder den häufigsten Standardwert darzustellen.
Unten finden Sie eine Verknüpfung zum Starten der Nummerierung bei 1 anstelle von 0.
Wenn Sie Flag-Werte festlegen möchten, um Bitoperatoren für Enum-Werte zu verwenden, beginnen Sie nicht mit der Nummerierung beim Nullwert.
quelle
Wenn Sie bei 1 beginnen, können Sie leicht Ihre Sachen zählen.
Wenn Sie bei 0 beginnen, verwenden Sie den ersten als Wert für nicht initialisierte Dinge.
quelle
Erstens, es sei denn, Sie geben bestimmte Werte aus einem bestimmten Grund an (der numerische Wert hat eine andere Bedeutung, z. B. die Datenbank oder ein externer Dienst), geben Sie zunächst überhaupt keine numerischen Werte an und lassen Sie sie explizit sein.
Zweitens sollten Sie immer ein Element mit dem Wert Null haben (in Nicht-Flags-Aufzählungen). Dieses Element wird als Standardwert verwendet.
quelle
Beginnen Sie sie nicht bei 0, es sei denn, es gibt einen Grund dafür, z. B. die Verwendung als Indizes für ein Array oder eine Liste, oder wenn es einen anderen praktischen Grund gibt (z. B. die Verwendung in bitweisen Operationen).
Sie
enum
sollten genau dort beginnen, wo es sein muss. Es muss auch nicht sequentiell sein. Wenn die Werte explizit festgelegt werden, müssen sie eine semantische Bedeutung oder praktische Überlegungen widerspiegeln. Zum Beispiel sollte eineenum
der "Flaschen an der Wand" von 1 bis 99 nummeriert sein, während eineenum
für Potenzen von 4 wahrscheinlich bei 4 beginnen und mit 16, 64, 256 usw. fortfahren sollte.Darüber hinaus sollte das Hinzufügen eines Elements mit dem Wert Null
enum
nur erfolgen, wenn es einen gültigen Status darstellt. Manchmal sind "keine", "unbekannt", "fehlend" usw. gültige Werte, aber oft nicht.quelle
Ich möchte meine Aufzählungen bei 0 beginnen, da dies die Standardeinstellung ist, aber ich möchte auch einen unbekannten Wert mit dem Wert -1 einfügen. Dies wird dann zur Standardeinstellung und kann manchmal beim Debuggen helfen.
quelle