Freigeben über


Enumerationstypen (C#-Programmierhandbuch)

Ein Enumerationstyp (auch als Enumeration bezeichnet) bietet eine effiziente Möglichkeit, einen Satz benannter integraler Konstanten zu definieren, die einer Variablen zugewiesen werden können. Angenommen, Sie müssen eine Variable definieren, deren Wert einen Wochentag darstellt. Es gibt nur sieben sinnvolle Werte, die diese Variable speichern kann. Um diese Werte zu definieren, können Sie einen Enumerationstyp verwenden, der durch die Verwendung des enum-Schlüsselworts deklariert wird.

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

Der zugrunde liegende Standardtyp aller Elemente in der Enumeration lautet int. Sie können mit einem Doppelpunkt einen anderen ganzzahligen numerischen Typ angeben, wie im vorherigen Beispiel dargestellt. Eine vollständige Liste möglicher Typen finden Sie in Enumeration (C#-Referenz).

Sie können die zugrunde liegenden numerischen Werte überprüfen, indem Sie dem zugrunde liegenden Typ, wie im folgenden Beispiel gezeigt umwandeln.

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 beschrieben, die mit der Verwendung eines Enumerations- statt eines numerischen Typs einhergehen:

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

  • In Visual Studio führt 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 vorhergehenden Beispiel hat Days.Sunday den Wert 0, Days.Monday den Wert 1 usw. Wenn Sie ein neues Days-Objekt erstellen, weist es den Standardwert Days.Sunday (0) auf, wenn Sie ihm nicht ausdrücklich einen Wert zuweisen. Wenn Sie eine Enumeration erstellen, wählen Sie den Standardwert aus, der am logischsten ist und weisen Sie ihm den Wert Null zu. Auf diese Weise erhalten alle Enumerationen diesen Standardwert, wenn ihnen nicht ausdrücklich beim Erstellen ein Wert zugewiesen wird.

Falls die Variable meetingDay vom Typ Days ist, können Sie ihr (ohne eine explizite Umwandlung) lediglich einen der von Days definierten Werte zuweisen. Und wenn sich der Besprechungstag ändert, können Sie meetingDay einen neuen Wert von Days zuweisen:

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

Hinweis

Es ist möglich, meetingDay einen beliebigen ganzzahligen Wert zuzuweisen.Zum Beispiel erzeugt diese Codezeile keinen Fehler: meetingDay = (Days) 42.Sie sollten dies jedoch nicht tun, weil die damit einhergehende Erwartung darin besteht, dass eine Enumerationsvariable nur einen der vom Enumerator definierten Werte enthält.Einer Variablen eines Enumerationstyps einen willkürlich gewählten Wert zuzuweisen, führt zu einem hohen Fehlerrisiko.

Sie können den Elementen in der Enumeratorliste, die einen Enumerationstyp aufweisen, beliebige Werte zuweisen und auch berechnete Werte verwenden:

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

Enumerationstypen als Bitflags

Sie können einen Enumerationstyp verwenden, um Bitflags zu definieren. Dadurch kann eine Instanz des Enumerationstyps eine Kombination aus den Werten speichern, die in der Enumeratorliste definiert sind. (Selbstverständlich sind einige Kombinationen möglicherweise im Programmcode nicht sinnvoll oder zulässig.)

Sie erstellen eine Bitflagenumeration, indem Sie das FlagsAttribute-Attribut anwenden und die Werte entsprechend definieren, damit biweise AND-Operationen, OR-Operationen, NOT-Operationen und XOR-Operationen durchgeführt werden können. Fügen Sie in eine Bitflagenumeration eine benannte Konstante mit dem Wert Null ein, was "Es sind keine Flags festelegt" bedeutet. Weisen Sie einem Flag nicht den Wert Null zu, falls dies nicht "Es sind keine Flags festgelegt" bedeutet.

Im folgenden Beispiel wird eine andere Version der Days-Enumeration mit dem Namen Days2 definiert. Days2 weist das Flags-Attribut auf, und jedem Wert wird die nächste höhere Potenz von 2 zugewiesen. So können Sie eine Days2-Variable mit dem Wert Days2.Tuesday und Days2.Thursday erstellen.

[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 Enumerator festzulegen, verwenden Sie den bitweisen OR-Operator, wie im folgenden Beispiel dargestellt:

// 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

Um zu ermittln, ob ein bestimmtes Flag festgelegt ist, verwenden Sie eine bitweise AND-Operation, wie im folgenden Beispiel dargestellt:

// 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 zum Definieren von Enumerationstypen mit dem FlagsAttribute-Attribut finden Sie unter Enum.

Verwenden der System.Enum-Methoden zur Ermittlung und Behandlung von Enumerationswerten

Alle Enumerationen sind Instanzen des Enum-Typs. Sie können von Enum keine neuen Klassen ableiten. Sie können jedoch seine Methoden verwenden, um Informationen darüber zu erhalten und Werte in einer Enumerationsinstanz 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 hierzu finden Sie unter [AllMembers.T:System.Enum].

Sie können für eine Enumeration auch eine neue Methode erstellen, indem Sie die Erweiterungsmethode verwenden. Weitere Informationen finden Sie unter Gewusst wie: Erstellen einer neuen Methode für eine Enumeration (C#-Programmierhandbuch).

Enthaltenes Buchkapitel

Weitere Informationen zu Variablen in Visual C-2010 Anfang

Siehe auch

Referenz

enum (C#-Referenz)

Enum

Konzepte

C#-Programmierhandbuch