Enumerationstypen (C#-Programmierhandbuch)

Ein Enumerationstyp (auch Enumeration oder enum genannt) bietet eine effiziente Möglichkeit zum Definieren von benannten ganzzahligen Konstanten, die einer Variablen zugewiesen werden können. Nehmen wir beispielsweise an, Sie müssen eine Variable definieren, deren Wert einen Tag der Woche darstellt. Es gibt nur sieben sinnvolle Werte, die diese Variable speichern kann. Sie können einen Enumerationstyp verwenden, der mithilfe des enum-Schlüsselworts deklariert wurde, um diese Werte zu definieren.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

Standardmäßig ist int der zugrunde liegende Typ jedes Elements in enum. Sie können mithilfe eines Doppelpunktes einen anderen ganzzahligen numerischen Typ angeben, wie im vorherigen Beispiel gezeigt. Eine vollständige Liste der möglichen Typen finden Sie unter enum (C#-Referenz).

Sie können die zugrunde liegenden numerischen Werte durch Umwandeln in den zugrunde liegenden Typ, wie im folgenden Beispiel gezeigt, überprüfen.

Days today = Days.Monday;  
int dayNumber =(int)today;  
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);  

Months thisMonth = Months.Dec;  
byte monthNumber = (byte)thisMonth;  
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);  

// Output:  
// Monday is day number #1.  
// Dec is month number #11.  

Im Folgenden werden die Vorteile der Verwendung eines enum anstelle eines numerischen Typs gezeigt:

  • Sie geben für Clientcode eindeutig die Werte an, die für die Variable gültig sind.

  • In Visual Studio listet IntelliSense die definierten Werte auf.

Wenn Sie keine Werte für die Elemente in der Enumeratorliste angeben, werden die Werte automatisch um 1 erhöht. Im vorherigen Beispiel hat Days.Sunday den Wert 0, Days.Monday hat den Wert 1 und so weiter. Beim Erstellen eines neuen Days-Objekt, wird es den Standardwert Days.Sunday (0) aufweisen, wenn Sie nicht explizit einen Wert zuweisen. Wenn Sie ein enum erstellen, wählen Sie den logischen Standardwert aus und weisen Sie ihm einen Wert von Null zu. Dadurch werden alle Enumerationen über diesen Standardwert verfügen, wenn sie nicht explizit einen Wert zugewiesen bekommen, wenn sie erstellt werden.

Wenn die Variable meetingDay vom Typ Days ist, dann können Sie (ohne eine explizite Umwandlung) für sie nur einen der durch Days definierten Werte zuweisen. Und wenn sich der Sitzungstag ändert, können Sie einen neuen Wert von Days auf meetingDay zuweisen:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
Hinweis

Es ist möglich, einen beliebigen ganzzahligen Wert an meetingDay zuzuweisen. Diese Codezeile ergibt z.B. keinen Fehler: meetingDay = (Days) 42. Allerdings sollten Sie dies nicht tun, da implizit erwartet wird, dass eine Enumerationensvariable nur einen der von enum definierten Werte enthält. Einen beliebigen Wert einer Variablen eines Enumerationstyps zuzuweisen bedeutet, ein hohes Fehlerrisiko einzuführen.

Sie können den Elementen in der Enumeratorliste eines Enumerationstyps Werte zuweisen, und Sie können auch berechnete Werte verwenden:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Enumerationstypen als Bitflags

Sie können einen Enumerationstyp zum Definieren von Bitflags verwenden. Dadurch kann eine Instanz des Enumerationstyps eine beliebige Kombination der Werte speichern, die in der Enumeratorliste definiert sind. (Natürlich können einige Kombinationen nicht sinnvoll oder in Ihrem Programmcode nicht zulässig sein.)

Sie erstellen ein Bitflags-Enum durch Anwenden des Attributs System.FlagsAttribute und definieren die Werte entsprechend, damit die bitweisen Operationen AND, OR, NOT und XOR ausgeführt werden können. In einem Bitflag-Enum ist eine benannte Konstante mit dem Wert Null enthalten, das bedeutet, dass „keine Flags festgelegt sind“. Geben Sie einem Flag keinen Wert Null, wenn es nicht bedeutet, dass „keine Flags festgelegt sind“.

Im folgenden Beispiel ist eine andere Version der Days-Enum mit dem Namen Days2 definiert. Days2 verfügt über das Flags-Attribut, und jedem Wert wird die nächste höhere Potenz von 2 zugewiesen. Dies ermöglicht Ihnen die Erstellung einer Days2-Variable, deren Wert Days2.Tuesday und Days2.Thursday ist.

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

Um ein Flag für einen enum festzulegen, verwenden Sie den bitweisen OR Operator, wie im folgenden Beispiel gezeigt:

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Verwenden Sie einen bitweisen AND-Vorgang, wie im folgenden Beispiel gezeigt, um zu bestimmen, ob ein bestimmtes Flag festgelegt ist:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Weitere Informationen zu den notwendigen Überlegungen beim Definieren von Enumerationstypen mit dem System.FlagsAttribute-Attribut finden Sie unter System.Enum.

Verwenden der Methoden System.Enum zum Ermitteln und Bearbeiten der Enumerationswerte

Alle Enumerationen sind Instanzen des Typs System.Enum. Sie können keine neuen Klassen von System.Enum ableiten, aber Sie können die zugehörigen Methoden verwenden, um Informationen zu ermitteln und Werte in einer enum-Instanz zu bearbeiten.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

Weitere Informationen finden Sie unter System.Enum.

Sie können auch mithilfe einer Erweiterungsmethode eine neue Methode für ein enum erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer neuen Methode für eine Enumeration (C#-Programmierhandbuch).

Siehe auch

System.Enum
C#-Programmierhandbuch
enum