Enumerationstypen (C#-Programmierhandbuch)Enumeration types (C# Programming Guide)

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.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Nehmen wir beispielsweise an, Sie müssen eine Variable definieren, deren Wert einen Tag der Woche darstellt.For example, assume that you have to define a variable whose value will represent a day of the week. Es gibt nur sieben sinnvolle Werte, die diese Variable speichern kann.There are only seven meaningful values which that variable will ever store. Sie können einen Enumerationstyp verwenden, der mithilfe des enum-Schlüsselworts deklariert wurde, um diese Werte zu definieren.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Month : 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.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Eine vollständige Liste der möglichen Typen finden Sie unter enum (C#-Referenz).For a full list of possible types, see enum (C# Reference).

Sie können die zugrunde liegenden numerischen Werte durch Umwandeln in den zugrunde liegenden Typ, wie im folgenden Beispiel gezeigt, überprüfen.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

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

Month thisMonth = Month.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:The following are advantages of using an enum instead of a numeric type:

  • Sie geben für Clientcode eindeutig die Werte an, die für die Variable gültig sind.You clearly specify for client code which values are valid for the variable.

  • In Visual StudioVisual Studio listet IntelliSense die definierten Werte auf.In Visual StudioVisual Studio, IntelliSense lists the defined values.

Wenn Sie keine Werte für die Elemente in der Enumeratorliste angeben, werden die Werte automatisch um 1 erhöht.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. Im vorherigen Beispiel hat Day.Sunday den Wert 0, Day.Monday hat den Wert 1 und so weiter.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Beim Erstellen eines neuen Day-Objekt, wird es den Standardwert Day.Sunday (0) aufweisen, wenn Sie nicht explizit einen Wert zuweisen.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. Wenn Sie ein enum erstellen, wählen Sie den logischen Standardwert aus und weisen Sie ihm einen Wert von Null zu.When you create an enum, select the most logical default value and give it a value of zero. Dadurch werden alle Enumerationen über diesen Standardwert verfügen, wenn sie nicht explizit einen Wert zugewiesen bekommen, wenn sie erstellt werden.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Wenn die Variable meetingDay vom Typ Day ist, dann können Sie (ohne eine explizite Umwandlung) für sie nur einen der durch Day definierten Werte zuweisen.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. Und wenn sich der Sitzungstag ändert, können Sie einen neuen Wert von Day auf meetingDay zuweisen:And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Hinweis

Es ist möglich, einen beliebigen ganzzahligen Wert an meetingDay zuzuweisen.It's possible to assign any arbitrary integer value to meetingDay. Diese Codezeile ergibt z.B. keinen Fehler: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. Allerdings sollten Sie dies nicht tun, da implizit erwartet wird, dass eine Enumerationensvariable nur einen der von enum definierten Werte enthält.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. Einen beliebigen Wert einer Variablen eines Enumerationstyps zuzuweisen bedeutet, ein hohes Fehlerrisiko einzuführen.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Sie können den Elementen in der Enumeratorliste eines Enumerationstyps Werte zuweisen, und Sie können auch berechnete Werte verwenden:You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

Enumerationstypen als BitflagsEnumeration types as bit flags

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.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Natürlich können einige Kombinationen nicht sinnvoll oder in Ihrem Programmcode nicht zulässig sein.)(Of course, some combinations may not be meaningful or allowed in your program code.)

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.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. In einem Bitflag-Enum ist eine benannte Konstante mit dem Wert Null enthalten, das bedeutet, dass „keine Flags festgelegt sind“.In a bit flags enum, include a named constant with a value of zero that means "no flags are set." Geben Sie einem Flag keinen Wert Null, wenn es nicht bedeutet, dass „keine Flags festgelegt sind“.Do not give a flag a value of zero if it does not mean "no flags are set".

Im folgenden Beispiel ist eine andere Version der Day-Enum mit dem Namen Days definiert.In the following example, another version of the Day enum, which is named Days, is defined. Days verfügt über das Flags-Attribut, und jedem Wert wird die nächste höhere Potenz von 2 zugewiesen.Days has the Flags attribute, and each value is assigned the next greater power of 2. Dies ermöglicht Ihnen die Erstellung einer Days-Variable, deren Wert Days.Tuesday | Days.Thursday ist.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

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

Um ein Flag für einen enum festzulegen, verwenden Sie den bitweisen OR Operator, wie im folgenden Beispiel gezeigt:To set a flag on an enum, use the bitwise OR operator as shown in the following example:

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

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

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

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.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:To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.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.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Verwenden der Methoden System.Enum zum Ermitteln und Bearbeiten der EnumerationswerteUsing the System.Enum methods to discover and manipulate enum values

Alle Enumerationen sind Instanzen des Typs System.Enum.All enums are instances of the System.Enum type. 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.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

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

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

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

Weitere Informationen finden Sie unter System.Enum.For more information, see System.Enum.

Sie können auch mithilfe einer Erweiterungsmethode eine neue Methode für ein enum erstellen.You can also create a new method for an enum by using an extension method. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer neuen Methode für eine Enumeration (C#-Programmierhandbuch).For more information, see How to: Create a New Method for an Enumeration.

Siehe auchSee also

System.Enum
C#-ProgrammierhandbuchC# Programming Guide
enumenum