enum (C#-Referenz)

Aktualisiert: November 2007

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. Beispiel:

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

In dieser Enumeration entspricht Sat dem Wert 0, Sun dem Wert 1, Mon dem Wert 2 usw. Enumeratoren können über Initialisierer verfügen, durch die die Standardwerte überschrieben werden. Beispiel:

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. Wir empfehlen jedoch, dass eine Enumeration eine Konstante mit einem Wert von 0 enthält. 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 zu deklarieren, z. B. byte, verwenden Sie nach dem Bezeichner einen Doppelpunkt gefolgt vom Typ:

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.

Hinweis:

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 durch eine bitweise OR-Operation verknüpft sind, werden Sie feststellen, dass das Attribut das Verhalten von enum bei der Verwendung bestimmter Tools beeinflusst. Solche Änderungen sind zu beobachten bei der Verwendung von Tools wie den Methoden der Console-Klasse, der Ausdrucksauswertung usw. (Siehe Beispiel 3.)

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 zusätzliche Elemente hinzugefügt werden, kann der Test für Standardwerte unerwartet true ergeben.

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

In diesem Beispiel wird eine Enumeration mit dem Namen 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
*/

In diesem 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.

[Flags]
public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Kommentare

Beachten Sie, dass, wenn FlagsAttribute entfernt wird, in dem Beispiel Folgendes ausgegeben wird:

5

5

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 1.10 Enumerationen

  • 6.2.2 Explizite Enumerationskonvertierungen

  • 14 Enumerationen

Siehe auch

Aufgaben

Beispiel für Attribute

Konzepte

Enumerationstypen (C#-Programmierhandbuch)

Enumerationsentwurf

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)

Weitere Ressourcen

C#-Referenz