Aufzählungen und Konstanten. Welche wann verwenden?

94

Ich habe einige Aufzählungen gelesen und finde, dass sie der Deklaration von Konstanten sehr ähnlich sind. Wie würde ich wissen, wann ich eine Konstante anstelle einer Aufzählung verwenden soll oder umgekehrt? Was sind einige der Vorteile der Verwendung von Aufzählungen?

Draco
quelle
Siehe auch stackoverflow.com/questions/11575376/… für eine ähnliche Frage für Java (Antworten gelten meistens auch für C #).
Alexei Levenkov

Antworten:

95

Verwenden Sie Aufzählungen, wenn Sie einen Wertebereich definieren möchten, der etwas sein kann. Farbe ist ein offensichtliches Beispiel wie:

public enum Colour
{
    White,
    Red,
    Blue
}

Oder vielleicht eine Reihe möglicher Dinge wie: (Beispiel, das ich von hier gestohlen habe, weil ich faul bin)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

Konstanten sollten für einen einzelnen Wert wie PI gelten. Es gibt keinen Bereich von PI-Werten, es gibt nur PI.

Weitere zu berücksichtigende Punkte sind:

  • a: Konstanten geben nicht unbedingt eine Beziehung zwischen den Konstanten an, während eine Aufzählung angibt, dass etwas eine der durch die Aufzählung definierten Mengen sein kann.
  • b: Eine definierte Aufzählung kann Ihnen bei der Typprüfung helfen, wenn sie als Argument verwendet wird. Konstanten sind nur Werte, daher liefern sie keine zusätzlichen semantischen Informationen.
Andrew Barrett
quelle
1
Was ist, wenn Sie am Ende .ToString()viel für die Aufzählung verwenden, einen Wert für die Verwendung einer Klasse mit const-Zeichenfolgen, die wie eine Aufzählung aussieht und sich verhält, aber einen Aufruf von umgeht ToString()? Beispiel
Sinjai
Warten Sie, ich glaube, ich habe meine eigene Frage beantwortet. Der Code in diesem Beispiel würde nicht funktionieren: Sie müssten die Eingabe als Zeichenfolge verwenden, die sich nicht wirklich wie eine Aufzählung verhält.
Sinjai
1
Warum konnten Sie nicht einfach eine statische Klasse Farbe mit konstanten Farben anstatt Aufzählung haben? Was ist der Unterschied?
WDUK
in kurzer AussageType Safety"
ahmednabil88
30

Was in den anderen Antworten fehlt, ist, dass Aufzählungen einen ganzzahligen Basistyp haben. Sie können die Standardeinstellung von int in einen anderen Integraltyp ändern, außer char wie:

enum LongEnum : long {
    foo,
    bar,
}

Sie können explizit von und implizit in den Basistyp umwandeln, was in switch-Anweisungen hilfreich ist. Beachten Sie, dass jeder Wert des Basistyps in eine Aufzählung umgewandelt werden kann, auch wenn die Aufzählung kein Mitglied mit dem entsprechenden Wert enthält. Es ist daher eine gute Idee, immer den Standardabschnitt in einem Switch zu verwenden. Übrigens erlaubt .NET selbst sogar Aufzählungen mit Gleitkommawerten, aber Sie können sie nicht in C # definieren, obwohl ich denke, dass Sie sie weiterhin verwenden können (außer in switch).

Darüber hinaus bietet die Verwendung von Aufzählungen mehr Typensicherheit. Wenn Sie beispielsweise int-Konstanten als Methodenparameter verwenden möchten, kann ich die Methode mit einem beliebigen int-Wert aufrufen. Zugegeben, durch Casting kann es auch mit Aufzählungen passieren, aber es wird nicht versehentlich passieren. Schlimmer ist die Möglichkeit, die Reihenfolge der Parameter zu verwechseln.

void method(int a, int b) {...}

Wenn die Konstante A nur in a und die Konstante B nur in b gehen darf, wird durch die Verwendung von zwei verschiedenen Aufzählungstypen ein Missbrauch während der Kompilierung aufgedeckt.

Johannes
quelle
20

Eine Konstante ist eine Sprachfunktion, die besagt, dass die Variable den Wert nicht ändert (damit der Compiler Optimierungen für dieses Wissen vornehmen kann), wenn eine Aufzählung ein bestimmter Typ ist.

Konstanten können ein beliebiger Datentyp sein, aber eine Aufzählung ist eine Aufzählung.

Ich verwende eine Aufzählung an jedem Ort, an dem Sie eine Reihe von Optionen haben und die Lesbarkeit des Codes verbessern möchten. Das heißt, Sie können Trace-Ebenen als int mit den Werten 0, 1, 2 oder als Aufzählung als Fehler, Warnung und Info haben.

Aufzählungen können auch als bitweise Operatoren verwendet werden, z. B. FontStyle.Bold | FontStyle.Italic würde Ihnen fette und kursive Schriftarten geben.

Robert MacLean
quelle
8

Zusätzlich zu Roberts Antwort:

  1. Verwenden Sie enum für eine endliche Menge benannter Werte. Sie interessieren sich nicht wirklich für den numerischen Wert hinter jedem Symbol (aber Sie haben immer noch die Möglichkeit, ihn aufzuerlegen, z. B. aus Gründen der Kompatibilität mit einem Legacy-System).

  2. Robert: Ja, Enums können als Bitfelder verwendet werden. Verwenden Sie das Flags- Attribut (und stellen Sie sicher, dass die Mitglieder der Aufzählung geeignete numerische Werte haben).

Serge Wautier
quelle
3

Die AC # -Konstante ähnelt einer Variablen darin, dass sie einem Wert einen definierten Namen gibt. Eine Konstante unterscheidet sich jedoch von einer Standardvariablen, da der der Konstante zugewiesene Wert nach seiner Definition niemals geändert werden kann. Der Hauptvorteil von Konstanten ist ihre Unterstützung bei der Erstellung von selbstdokumentierendem Code sowie die Ermöglichung der Deklaration von Schlüsselwerten an einem einzigen Ort, was eine einfache Wartung ermöglicht, falls der Wert aktualisiert und die Software neu kompiliert werden muss.

Enumerator-Listen sind nützlich, um Sequenzen und Zustände zu definieren, insbesondere wenn diese Zustände auf natürliche Weise fortschreiten. Dies liegt daran, dass jede Konstante in der Liste entweder mit ihrem Namen oder ihrem Wert formatiert und verglichen werden kann. Eine Aufzählung kann auch verwendet werden, um einen begrenzten Satz gültiger Werte zu definieren.

einfach hart
quelle
3

Eine Sache, die ich bei der Verwendung enumanstelle von nützlich finde, constist, dass Sie die Werte in einem durchlaufen können enum. Es ist viel schwieriger, dies mit constWerten zu tun .

David Klempfner
quelle