web-dev-qa-db-de.com

Sollte eine Aufzählung mit einer 0 oder einer 1 beginnen?

Stellen Sie sich vor, ich habe die folgende Enumeration definiert:

public enum Status : byte
{
    Inactive = 1,
    Active = 2,
}

Was ist die beste Vorgehensweise bei der Verwendung von enum? Sollte es anfangen mit 1 wie das obige Beispiel oder beginnen mit 0 (ohne die expliziten Werte) wie folgt:

public enum Status : byte
{
    Inactive,
    Active
}
129
Acaz Souza

Framework Design Guidelines:

  • Geben Sie mit einen Wert von Null für Ihre Nicht-Flags-Aufzählung an. Wenn Keine für die Aufzählung nicht geeignet ist, weisen Sie dem Element, das sollte, den Nullwert zu als Standardwert für die Aufzählung verwendet werden.

  • Vermeiden Sie die Verwendung von Flag-Enum-Werten für normale Elemente, die negativ oder null sind. Ein Aufzählungswert von Null führt zu Problemen mit und Operationen usw

154
Andrey Taptunov

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 behalte, 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 alte persistierte Objekte nicht korrekt laden. Wenn Sie diese Werte dauerhaft speichern möchten, würde ich dringend empfehlen, die Werte explizit festzulegen.

62
pstrjds

Wenn Sie keinen bestimmten Grund haben, dies zu ändern, belassen Sie die Enums mit ihren Standardwerten, die bei Null beginnen.

public enum Status : byte
{
    Inactive,
    Active
}
14
FishBasketGordo

Eine Aufzählung ist ein Werttyp und sein Standardwert (zum Beispiel 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 (z. B. Unbekannt) haben.

Wenn Sie in Ihrem Beispiel möchten, dass Inactive der Standardwert ist, sollte er den Wert Null haben. Andernfalls möchten Sie möglicherweise eine Konstante Unknown hinzufügen.

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:

  • Flags Aufzählungen

  • Aufzählungen, deren Werte bei der Interoperabilität mit externen Systemen (z. B. COM) verwendet werden.

14
Joe

Ich würde sagen, dass die beste Vorgehensweise darin besteht, sie nicht zu nummerieren und implizit zu lassen - was bei 0 beginnen würde. Da dies implizit ist, ist es die bevorzugte Sprache, der man immer folgen sollte :)

Ich würde eine boolesche Typenzahl mit einer 0 beginnen.

Es sei denn, "Inative" bedeutet etwas anderes als "Inactive" :)

Dies behält den Standard für diejenigen.

5

Ich würde sagen, es kommt darauf an, wie man sie benutzt. Für das Kennzeichnen von Aufzählungen ist es eine gute Praxis, 0 für den Wert None zu haben:

[Flags]
enum MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    All = Option1 | Option2 | Option3,
}

Wenn Ihre Enumeration wahrscheinlich einer Datenbank-Lookup-Tabelle zugeordnet wird, würde ich sie mit 1 beginnen. Für professionell geschriebenen Code sollte dies keine Rolle spielen, aber dies verbessert 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.

5

Sofern Sie keinen guten Grund haben, die Rohwerte zu verwenden, sollten Sie immer nur implizite Werte verwenden und diese mit Status.Active Und Status.Inactive Referenzieren.

Der Haken ist, dass Sie möglicherweise Daten in einer Einfachdatei oder Datenbank speichern oder eine Einfachdatei oder Datenbank verwenden möchten, die von einer anderen Person erstellt wurde. Wenn Sie es selbst machen, machen Sie es so, dass die Nummerierung dem entspricht, wofür die Aufzählung verwendet wird.

Wenn die Daten nicht von Ihnen stammen, möchten Sie natürlich das verwenden, was der ursprüngliche Entwickler als Nummerierungsschema verwendet hat.

Wenn Sie planen, die Aufzählung als eine Reihe von Flags zu verwenden, gibt es eine einfache Konvention, die es wert ist, befolgt zu werden:

enum Example
{
  None      = 0,            //  0
  Alpha     = 1 << 0,       //  1
  Beta      = 1 << 1,       //  2
  Gamma     = 1 << 2,       //  4
  Delta     = 1 << 3,       //  8
  Epsilon   = 1 << 4,       // 16
  All       = ~0,           // -1
  AlphaBeta = Alpha | Beta, //  3
}

Die Werte sollten Zweierpotenzen sein und können mit Bitverschiebungsoperationen ausgedrückt werden. None sollte offensichtlich 0 sein, aber All ist weniger offensichtlich -1. ~0 Ist die binäre Negation von 0 Und führt zu einer Zahl, bei der jedes Bit auf 1 Gesetzt ist was einen Wert von -1 Darstellt. . Für zusammengesetzte Flags (die häufig der Einfachheit halber verwendet werden) können andere Werte mit dem bitweisen Operator oder dem Operator | Zusammengeführt werden.

4
zzzzBov

Wenn Sie bei 1 anfangen, können Sie leicht eine Zählung Ihrer Sachen erhalten.

{
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

Wenn Sie bei 0 beginnen, verwenden Sie den ersten Wert als Wert für nicht initialisierte Dinge.

{
    BOX_NO_THING   = 0,
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};
2

Weisen Sie keine Nummern zu. Verwenden Sie es einfach so, wie es verwendet werden soll.

2
Hooch

Wenn nicht angegeben, beginnt die Nummerierung bei 0.

Es ist wichtig, explizit zu sein, da Enums häufig serialisiert und als Int und nicht als String gespeichert werden.

Für jede in der Datenbank gespeicherte Enumeration werden die Optionen immer explizit nummeriert, um ein Verschieben und erneutes Zuweisen während der Wartung zu verhindern.

Laut Microsoft wird empfohlen, die erste Null-Option zu verwenden, um einen nicht initialisierten oder den am häufigsten verwendeten Standardwert darzustellen.

Unten finden Sie eine Abkürzung, um die Nummerierung bei 1 anstatt bei 0 zu beginnen.

public enum Status : byte
{
    Inactive = 1,
    Active
}

Wenn Sie Merkerwerte setzen möchten, um Bitoperatoren für Aufzählungswerte zu verwenden, beginnen Sie nicht mit der Nummerierung bei Null.

2
dru

Erstens, es sei denn, Sie geben bestimmte Werte aus einem bestimmten Grund an (der numerische Wert hat eine andere Bedeutung, d. H. Die Datenbank oder der externe Dienst). Geben Sie dann überhaupt keine numerischen Werte an und lassen Sie sie explizit angeben.

Zweitens sollten Sie immer ein Element mit dem Wert Null haben (in Aufzählungen, die keine Flags sind). Dieses Element wird als Standardwert verwendet.

0
Justin Niessner

Beginnen Sie sie nicht bei 0, es sei denn, es gibt einen Grund, sie als Indizes für ein Array oder eine Liste zu verwenden, oder es gibt einen anderen praktischen Grund (wie die Verwendung in bitweisen Operationen).

Ihr enum sollte genau dort beginnen, wo es sein muss. Es muss auch nicht sequentiell sein. Die Werte müssen, wenn sie explizit festgelegt sind, eine semantische Bedeutung oder eine praktische Überlegung widerspiegeln. Zum Beispiel sollte ein enum von "Flaschen an der Wand" von 1 bis 99 nummeriert sein, während ein enum für Potenzen von 4 wahrscheinlich bei 4 beginnen und mit 16, 64, 256 fortfahren sollte , etc.

Darüber hinaus sollte ein Element mit dem Wert Null zum enum nur hinzugefügt werden, wenn es einen gültigen Status darstellt. Manchmal sind "none", "unknown", "missing" usw. gültige Werte, aber oft nicht.

0
wprl