Fortgeschrittene Grundlagen: Enumeration

Enumerationen (auch Enumerationstypen) sind ein spezieller Datentyp, mit welchem es möglich ist, einem konstanten Text einen numerischen Wert zuzuweisen. Dies soll vor allem dem Programmierer eine Hilfestellung sein. Des Weiteren macht es einen Programmcode übersichtlicher.
Ein Beispiel dazu: Wir benötigen in unserem Programm die Wochentage. Diesen Wochentagen liegen intern die Werte 0 für Sonntag, 1 für Montag, … und 6 für Samstag zu Grunde. Wenn wir nun intern z. B. den Wert 4 haben, müssen wir als Programmierer erst überlegen, um welchen Tag es sich handelt. Wollen wir eine Abfrage machen, ob der Wert dem Freitag entspricht, müssten wir also if (iTag == 5) notieren. Dies ist weder übersichtlich noch guter Programmierstil. In einem solchen Fall könnten wir eine Enumeration erstellen.
Um eine eigene Enumeration zu verwenden, müssen wir diese erst definieren. Dazu benötigen wir das Schlüsselwort enum gefolgt von dem Namen, welchen wir der Enumeration geben wollen. Vor dem Schlüsselwort kann des Weiteren ein Zugriffsmodifzierer angegeben werden. Wird dieser nicht angegeben, wird private als Sicherheitsstufe verwendet. Die Definition einer Enumeration bildet immer einen Block. Innerhalb des Blocks werden die einzelnen Werte (konstante Texte) angegeben und durch Komma getrennt. Den numerischen Wert müssen wir nicht zwangsläufig angeben. Werden keine Werte angegeben, entspricht der erste Wert der Zahl 0. Die weiteren Elemente werden durchgezählt. Über das Gleichheitszeichen lassen sich die Werte ändern. Wird ein Wert nicht angegeben, setzt die normale Zählung (vorheriger Wert + 1) wieder in Kraft.
Sobald eine Enumeration definiert wurde, können wir diese als Datentyp einer Variablen verwenden. Die Zuweisung einer Enumerations-Variable erfolgt durch den Namen der Enumeration und den konstanten Text eines einzelnen Elements (getrennt durch einen Punkt). Eine Enumeration besitzt standardmäßig einen Wertebereich des Datentyps int. Dieser kann über den Doppelpunkt gefolgt vom Datentyp hinter dem Namen der Enumerations-Definition geändert werden. Der gewählte Datentyp muss jedoch immer ein numerischer Wert sein.
Die statische Klasse Enum besitzt einige Hilfsfunktionen, um Konvertierungen durchzuführen. Wollen wir z. B. den Namen (konstanten Text) des dazugehörigen numerischen Wertes ermitteln, kann uns die Funktion GetName() behilflich sein. Als erster Parameter wird der Typ der Enumeration benötigt. Hierfür benötigen wir das Schlüsselwort typeof gefolgt von runden Klammern, in welcher der Datentyp der Ziel-Enumeration angegeben wird. Der zweite Parameter entspricht dem numerischen Wert. Über die Funktion IsDefined() können wir ermitteln, ob der angegebene Name (konstante Text) in der Enumeration vorhanden ist. Die Rückgabe der Funktion ist ein Wert des Datentyps bool. Über die Funktion Parse() können wir den Text in den dazugehörigen numerischen Wert umwandeln. Um ein Enumerations-Element in den zu Grund liegenden, numerischen Wert umzuwandeln, reicht es aus, eine explizite Typumwandlung (cast) durchzuführen.

Program.cs

using System;

namespace CSV20.Enumeration
{
    class Program
    {
        private enum Monate
        {
            Januar = 1,
            Februar,
            März,
            April,
            Mai,
            Juni,
            Juli,
            August,
            September,
            Oktober,
            November,
            Dezember
        }

        private enum Wochentage : byte  // mit ": byte", weisen wir der Enumeration einen Wertebereich von 0 - 255 zu
        {
            Sonntag,        // Sonntag ist automatisch 0
            Montag,
            Dienstag,
            Mittwoch,
            Donnerstag,
            Freitag,
            Samstag
        }

        static void Main(string[] args)
        {
            int iMonat;
            Wochentage eWochentag = Wochentage.Freitag;
            string sWochentagEingabe;
            
            Console.Write("Bitte geben Sie eine Monats-Nummer ein: ");
            if (!int.TryParse(Console.ReadLine(), out iMonat) || iMonat < 1 || iMonat > 12)
                Console.WriteLine("Der eingegebene Monat war ungültig!");
            else
                Console.WriteLine(Enum.GetName(typeof(Monate), iMonat));

            Console.Write("Bitte geben Sie einen Wochentag ein: ");
            sWochentagEingabe = Console.ReadLine();
            if (!Enum.IsDefined(typeof(Wochentage), sWochentagEingabe))
                Console.WriteLine("Der eingegebene Wochentag war ungültig, Freitag wird stattdessen verwendet!");
            else
                eWochentag = (Wochentage)Enum.Parse(typeof(Wochentage), sWochentagEingabe);
            Console.WriteLine("Wert von Wochentage." + eWochentag + ": " + (int)eWochentag);
            
            Console.ReadKey();
        }
    }
}
Download

LinksRechts