int
, und Auswertung dieses Wertes tun. Das hat aber mehrere Nachteile:
5
sagt Ihnen z.B. nicht, welche Bedeutung dieser Wert hat.
Ausgabe()
führt abhängig vom übergebenen Wert des Parameters modus
eine andere Aktion aus. Da aber beliebige int
-Werte zur Übergabe erlaubt
sind, kann sich auch einmal ein ungültiger Wert einschleichen. Dies kann aber beispielsweise der Compiler nicht feststellen. Außerdem kann man keine Beziehung vom
übergebenen Wert 2
an die Methode Ausgabe()
herstellen.
void Ausgabe(int modus) { switch(modus) { case 0: // tue dies; break; case 1: // tue das; break; } } ... Ausgabe(2);
enum
deklariert und enthalten eine oder mehrere Aufzählungskonstanten.
Aktion
deklariert. Diese besteht aus drei
Konstanten. Als Parameter wird nun kein int
-Wert, sondern ein Wert vom Typ Aktion
an die Methode übergeben. Beim Aufruf der Methode muss eine der
Aufzählungskonstanten übergeben werden. Jetzt kann der Compiler tatsächlich prüfen, dass nur eine der definierten Konstanten übergeben wurde. Auch innerhalb der switch
-Anweisung in
der Methode Ausgabe()
können nun direkt die Aufzählungskonstanten verwendet werden. Dies ist wesentlich sprechender als einfache Zahlenwerte.
enum Aktion { Loeschen, Einfuegen, Aendern }; void Ausgabe(Aktion modus) { switch(modus) { case Aktion.Loeschen: // tue dies; break; case Aktion.Einfuegen: // tue das; break; } } ... Ausgabe(Aktion.Einfuegen);
enum
deklariert.
int
.
1
usw. Haben Sie
zwischendurch selbst einer Konstanten einen Wert zugewiesen, erhält das nächste Element einen um 1 höheren Wert. Dadurch kann es auch vorkommen, dass mehrere Konstanten (automatisch) mit den gleichen Werten versehen werden.
5
und der zweiten den Wert 3
zuweisen.
Wert1
von Wert2
abhängt und Wert2
implizit von Wert1
(sie erhält ja den um 1 höheren Wert als Wert1
).
enum Daten { Wert1, Wert2, Wert3 = Wert1 } enum Daten { Wert1 = Wert2, Wert2 } enum Daten { Wert1 = 1, Wert2, Wert3 = Wert1 }
FarbSchema
deklariert. Die Methode SetFarbSchema()
übernimmt als Parameter das ausgewählte Farbschema und setzt die Vorder-
und Hintergrundfarbe der Konsole entsprechend des gewählten Farbschemas auf die vordefinierten Werte. Zum Setzen dieser Werte dienen Eigenschaften der Klasse Console
. Damit die
Einstellungen sofort für den Inhalt des gesamten Konsolenfensters aktiv werden, wird zum Abschluss der Inhalt des Fensters durch den Aufruf von Clear()
gelöscht. Der Hintergrund wird dann
in der neu eingestellten Farbe gezeigt.
Die Konfiguration von Konsolenanwendungen wird später noch in einem eigenen Kapitel (kurz) besprochen.
using System; namespace CSharpBuch.Kap09 { public enum FarbSchema { Ocean, Normal, Pink }; public class EinfacheAufzaehlungen { static void Main(string[] args) { FarbSchema fs = FarbSchema.Ocean; SetFarbSchema(fs); Console.WriteLine("Ausgewähltes Farbschema ..." + fs.ToString()); Console.ReadLine(); } static void SetFarbSchema(FarbSchema fs) { switch(fs) { case FarbSchema.Normal: Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; break; case FarbSchema.Ocean: Console.BackgroundColor = ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.Yellow; break; case FarbSchema.Pink: Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; break; } Console.Clear(); } } }Listing 9.1: EinfacheAufzaehlungen.cs
int
. Sie können aber auch einen anderen ganzzahligen Typ, außer char
, angeben.
Anwendungsgebiete sind Speicherplatzersparnis und die Vereinfachung der Weiterverarbeitung, wenn die Konstanten später in einem anderen Typ als int
benötigt werden.
Wenn Sie auf den numerischen Wert einer Aufzählungskonstante zugreifen wollen, müssen Sie in jedem Fall einen Cast in den gewünschten Typ vornehmen.
Wochentage
wird der Datentyp byte
verwendet. Durch einen Cast kann der numerische Wert einer Aufzählungskonstante, hier Mo
, ermittelt werden.
enum Wochentage: byte { Mo, Di, Mi, Do, Fr, Sa, So }; ... byte b = (byte)Wochentage.Mo;
Enum
abgeleitet. Ein Aufzählungstyp erbt dadurch aber keine neuen Methoden (außer
natürlich den Methoden der Klasse Object
). Sie können aber die statischen Methoden der Struktur Enum
nutzen, denen Sie den Aufzählungstyp in Form eines
Type-Parameters übergeben (typeof(Aufzählungstyp)
).
Methode | Beschreibung |
Format() | Formatiert eine Konstante in einen vorgegebenen Typ. Das Ausgabeformat ist als zweiter Parameter anzugeben. |
GetName() | Liefert den bzw. die Namen (Bezeichner) einer oder aller Konstanten einer Aufzählung. |
GetUnderlyingType() | Liefert den Basistyp der Aufzählung zurück, z.B. int oder byte . |
GetValues() | Liefert die numerischen Werte der Konstanten zurück. |
IsDefined() | Liefert einen booleschen Wert, der angibt, ob eine Konstante, deren Name als string übergeben wird, in einer Aufzählung vorhanden ist. |
Parse() | Liefert eine Aufzählungskonstante aufgrund des übergebenen Bezeichners zurück. |
INFO
Beachten Sie, dass die MethodenGetNames()
und GetValues()
nicht immer die Reihenfolge der Konstanten widerspiegeln, wie sie in
der Typdefinition der Aufzählung verwendet wird.Enum
verwendet, um Informationen zu der Aufzählung FarbSchema
zu erhalten (die diesmal etwas anders deklariert
wurde). Auf diese Weise können Sie also auch Aufzählungen dynamisch auswerten, die Sie eventuell über fremde Bibliotheken bezogen haben. Eine größere Bedeutung kommt aber z.B. der Tatsache
zu, dass sich bei Änderung der Aufzählungskonstanten (neue hinzufügen, Vergabe von Vorgabewerten etc.) die Werte der Aufzählungskonstanten ändern können. Dies können Sie nun feststellen und
gegebenenfalls darauf reagieren.
using System; namespace CSharpBuch.Kap09 { enum FarbSchema: byte { Ocean = 0, Normal = 3, Pink } public class SpezialAufzaehlungen { static void Main(string[] args) { FarbSchema fs = FarbSchema.Pink; Console.WriteLine("Methoden der Strukur Enum ..."); Console.WriteLine("Format(): " + Enum.Format(typeof(FarbSchema), FarbSchema.Ocean, "G")); Console.WriteLine("GetName(): " + Enum.GetName(typeof(FarbSchema), fs)); Console.WriteLine("Get(): " + Enum.GetUnderlyingType(typeof(FarbSchema))); if(Enum.IsDefined(typeof(FarbSchema), "Pink")) { Console.WriteLine("IsDefined(): Pink gibt's in FarbSchema"); FarbSchema fs2 = (FarbSchema)Enum.Parse(typeof(FarbSchema), "Pink"); } Console.WriteLine("\nAlle Namen der Aufzählungskonstanten: "); foreach(string s in Enum.GetNames(typeof(FarbSchema))) Console.WriteLine(s); Console.WriteLine("\nAlle Werte der Aufzählungskonstanten: "); foreach(byte b in Enum.GetValues(typeof(FarbSchema))) Console.WriteLine(b); } } }Listing 9.2: SpezialAufzaehlungen.cs
int
erwartet. Führen Sie in dieser Methode, abhängig vom übergebenen Wert, die zur Aufzählungskonstante passende Operation
aus und geben Sie das Ergebnis zurück.
Verwenden Sie als Basistyp der Aufzählung den Typ byte
.