enum (C#-Referenz)

Das enum-Schlüsselwort wird zum Deklarieren einer Enumeration verwendet. Dies ist ein eigener Typ, der aus einer Gruppe benannter Konstanten, der so genannten Enumeratorliste, besteht.

In der Regel ist es am besten, eine Enumeration direkt innerhalb eines Namespace so zu definieren, dass alle Klassen im Namespace auf gleiche Weise darauf zugreifen können. Aber eine Enumeration kann auch innerhalb einer Klasse oder einer Struktur geschachtelt werden.

Der erste Enumerator hat standardmäßig den Wert 0, und der Wert jedes nachfolgenden Enumerators wird jeweils um 1 erhöht. In der folgenden Enumeration gilt z. B.: Sat ist 0, Sun ist 1, Mon ist 2 usw.

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Enumeratoren können mithilfe von Initialisierern die Standardwerte überschreiben, wie im folgenden Beispiel gezeigt.

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

In dieser Enumeration wird erzwungen, dass die Abfolge von Elementen mit 1 und nicht mit 0 beginnt. Allerdings wird das Einfügen einer Konstante mit dem Wert 0 empfohlen. Weitere Informationen finden Sie unter Enumerationstypen (C#-Programmierhandbuch).

Jeder Enumerationstyp besitzt einen zugrunde liegenden Typ, bei dem es sich um jeden ganzzahligen Typ außer char handeln kann. Der zugrunde liegende Standardtyp von Enumerationselementen lautet int. Um eine Enumeration eines anderen ganzzahligen Typs, z. B. byte zu deklarieren, verwenden Sie einen Doppelpunkt nach dem Bezeichner gefolgt vom Typ, wie im folgenden Beispiel gezeigt.

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Die zulässigen Typen für eine Enumeration sind byte, sbyte, short, ushort, int, uint, long oder ulong.

Einer Variablen vom Typ Days kann jeder Wert im Bereich des zugrunde liegenden Typs zugewiesen werden. Die Werte sind nicht auf benannte Konstanten eingeschränkt.

Der Standardwert eines enum E ist der Wert, der durch den Ausdruck (E)0 erzeugt wird.

Tipp

Ein Enumeratorname darf keine Leerzeichen enthalten.

Der zugrunde liegende Typ legt fest, wie viel Speicher für jeden Enumerator reserviert wird. Es ist jedoch eine explizite Typumwandlung erforderlich, um einen enum-Typ in einen ganzzahligen Typ zu konvertieren. Durch die folgende Anweisung wird der Sun-Enumerator beispielsweise einer Variablen vom Typ int zugewiesen. Dabei wird für die Konvertierung von enum in int eine Typumwandlung verwendet.

int x = (int)Days.Sun;

Wenn System.FlagsAttribute auf eine Enumeration mit Elementen angewendet wird, die mit einer bitweisen OR-Operation kombiniert werden können, beeinflusst das Attribut das Verhalten von enum bei der Verwendung bestimmter Tools. Solche Änderungen sind zu beobachten bei der Verwendung von Tools wie den Methoden der Console-Klasse und der Ausdrucksauswertung. (Siehe das dritte Beispiel.)

Stabile Programmierung

Zur Kompilierzeit werden alle Verweise auf die einzelnen Werte einer Enumeration in numerische Literale konvertiert, wie im Falle von Konstanten. Dies kann zu möglichen Versionsproblemen führen, wie in Konstanten (C#-Programmierhandbuch) beschrieben.

Das Zuweisen zusätzlicher Werte zu neuen Enumerationsversionen oder das Ändern der Werte von Enumerationsmembern in einer neuen Version kann für abhängigen Code Probleme verursachen. Enumerationswerte werden oft in switch-Anweisungen verwendet. Wenn dem enum-Typ weitere Elemente hinzugefügt wurden, kann der standardmäßige Abschnitt der switch-Anweisung unerwartet ausgewählt werden.

Falls andere Entwickler Ihren Code verwenden, sollten Sie Richtlinien bereitzustellen, wie deren Code darauf reagieren soll, wenn irgendeinem enum-Typ neue Elemente hinzugefügt werden.

Beispiel

Im folgenden Beispiel wird die Enumeration Days deklariert. Zwei Enumeratoren werden explizit in ganze Zahlen konvertiert und Ganzzahlen-Variablen zugewiesen.


public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

Im folgenden Beispiel wird die Basistypoption verwendet, um ein enum zu deklarieren, dessen Member vom Typ long sind. Beachten Sie, dass, obwohl der Enumeration der Typ long zugrunde liegt, die Enumerationsmember noch explizit mithilfe einer Typumwandlung in den Typ long umgewandelt werden müssen.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

Im folgenden Codebeispiel werden die Verwendung des System.FlagsAttribute Attributs in einer enum-Deklaration und seine Wirkung veranschaulicht.

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays
        // the name of each enum element that corresponds to a flag that has
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Kommentar

Wenn Sie Flags entfernen, werden im Beispiel die folgenden Werte angezeigt:

5

5

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch

Referenz

C#-Schlüsselwörter

Tabelle ganzzahliger Typen (C#-Referenz)

Tabelle integrierter Typen (C#-Referenz)

Tabelle für implizite numerische Konvertierungen (C#-Referenz)

Tabelle für explizite numerische Konvertierungen (C#-Referenz)

Konzepte

Enumerationstypen (C#-Programmierhandbuch)

Enumerationsentwurf

Weitere Ressourcen

C#-Referenz

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Dezember 2010

Dem letzten Beispiel wurden Kommentare hinzugefügt.

Kundenfeedback.