Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Tipp
Neu bei der Entwicklung von Software? Beginnen Sie zuerst mit den Lernprogrammen " Erste Schritte ". Sobald Sie einen festen Satz von Auswahlmöglichkeiten in Ihrem Code darstellen müssen, werden Enumerationen auftreten.
Haben Sie Erfahrung in einer anderen Sprache? C#-Enumerationen funktionieren ähnlich wie Enumerationen in Java oder C++ mit zusätzlicher Unterstützung für Bitkennzeichnungen und Musterabgleich. Überfliegen Sie die Flags und Switch-Ausdruck-Abschnitte für C#-spezifische Muster.
Ein Enumerationstyp (oder Enum) definiert einen Satz benannter Konstanten, die auf einem ganzzahligen Wert basieren. Verwenden Sie Enums, wenn ein Wert einer festen Gruppe von Optionen entsprechen muss – Wochentage, HTTP-Statuscodes, Log-Level oder Richtungen. Enumerationen machen ihren Code besser lesbar und weniger fehleranfällig als unformatierte ganzzahlige Konstanten, da der Compiler die benannten Werte erzwingt.
Deklariere ein Enum
Definieren Sie eine Enumeration mit dem enum Schlüsselwort gefolgt vom Typnamen und den zugehörigen Membern:
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
Standardmäßig lautet intder zugrunde liegende Typ , und die Werte beginnen bei 0 und erhöhen sie um eins.
Season.Spring ist 0, Season.Summer ist 1usw.
Angeben eines zugrunde liegenden Typs und expliziter Werte
Sie können einen anderen integralen Typ auswählen und explizite Werte zuweisen, um die numerische Darstellung zu steuern:
enum HttpStatus : ushort
{
OK = 200,
NotFound = 404,
InternalServerError = 500
}
Verwenden Sie explizite Werte, wenn die Zahlen eine externe Bedeutung haben, z. B. HTTP-Statuscodes oder Protokollbezeichner. Der zugrunde liegende Typ kann ein beliebiger integraler Typ sein, außer char. Verwenden Sie byte, , short, ushort, int, uint, oder longulong.
Enumerationen in Switchausdrücken verwenden
Enumerationen funktionieren natürlich mit switch Ausdrücken und Mustererkennung. Der Compiler warnt Sie, wenn Sie nicht alle Member behandeln, wodurch Fehler verhindert werden, wenn Sie später einen neuen Wert hinzufügen:
static string DescribeSeason(Season season) => season switch
{
Season.Spring => "Flowers bloom and temperatures rise.",
Season.Summer => "Long days and warm weather.",
Season.Autumn => "Leaves change color and fall.",
Season.Winter => "Short days and cold temperatures.",
_ => throw new ArgumentOutOfRangeException(nameof(season))
};
var today = Season.Autumn;
Console.WriteLine(DescribeSeason(today));
Das Verwurfsmuster (_) behandelt jeden Wert, der nicht explizit aufgeführt ist.
Der Musterabgleich ist ein C#-Feature, das einen Wert anhand einer Form oder Bedingung testet. In diesem Beispiel überprüft jeder case, ob das Enum mit einem bestimmten Element übereinstimmt. Switch-Ausdrücke sind eine von mehreren Musterabgleichsformen. Weitere Informationen zum Musterabgleich finden Sie unter Musterabgleich.
Bitkennzeichnungen
Wenn eine Enumeration eine Kombination von Auswahlmöglichkeiten anstelle einer einzelnen Auswahl darstellt, definieren Sie jedes Element als Zweierpotenz und wenden FlagsAttribute an.
[Flags]
enum FileAccess
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write,
All = Read | Write | Execute
}
Kombinieren Sie Werte mithilfe des | Operators und testen Sie einzelne Flags mithilfe von HasFlag.
var permissions = FileAccess.Read | FileAccess.Write;
Console.WriteLine(permissions); // ReadWrite
Console.WriteLine(permissions.HasFlag(FileAccess.Read)); // True
Console.WriteLine(permissions.HasFlag(FileAccess.Execute)); // False
Das [Flags] Attribut wirkt sich auch auf ToString(). Es zeigt kombinierte Werte als durch Kommas getrennte Namen (wie Read, Write) anstelle einer Rohzahl an. Weitere Informationen finden Sie unter System.FlagsAttribute.
Konvertieren zwischen Enumerationen und ganzen Zahlen
Explizite Typumwandlungen zwischen einem Enum und seinem zugrunde liegenden ganzzahligen Typ.
var status = HttpStatus.NotFound;
ushort code = (ushort)status;
Console.WriteLine($"Status: {status} ({code})"); // Status: NotFound (404)
var fromCode = (HttpStatus)200;
Console.WriteLine(fromCode); // OK
Beachten Sie, dass das Umwandeln einer ganzen Zahl in eine Enumeration nicht überprüft, ob der Wert einem definierten Element entspricht. Verwenden Sie Enum.IsDefined, um die Gültigkeit zu überprüfen, wenn Sie numerische Eingaben aus externen Quellen akzeptieren.
Parsen von Zeichenketten und Iterieren von Werten
Die Enum Basisklasse stellt Methoden zum Analysieren von Zeichenfolgen und Durchlaufen aller definierten Werte bereit:
// Parse a string to an enum value:
var parsed = Enum.Parse<Season>("Winter");
Console.WriteLine(parsed); // Winter
// Try to parse safely. It returns false only when the input can't be parsed. Call Enum.IsDefined to validate named members:
if (Enum.TryParse<Season>("Monsoon", out var unknown))
{
Console.WriteLine(unknown);
}
else
{
Console.WriteLine("'Monsoon' is not a valid Season"); // 'Monsoon' is not a valid Season
}
// Iterate over all values in an enum:
foreach (var season in Enum.GetValues<Season>())
{
Console.WriteLine($"{season} = {(int)season}");
}
// Spring = 0
// Summer = 1
// Autumn = 2
// Winter = 3
Verwenden Sie Enum.TryParse<TEnum>(String, Boolean, TEnum) anstelle von Enum.Parse<TEnum>(String), wenn die Eingabe möglicherweise ungültig ist. Es gibt false zurück, anstatt eine Ausnahme auszulösen.