Enumerationen und default-Werte

2. Dezember 2013
Enumerationen sind eine gute Möglichkeit, eine festgelegte Menge von Werten zu definieren, die einer Variablen zugewiesen werden können. Bei der Verwendung von Enumerationen sollte man sich jedoch über die default-Werte im Klaren sein, die bei Enumerations-Variablen gesetzt werden.

Bei einer Enumeration werden Bezeichnern ganzzahlige Werte zugrunde gelegt. Der Standard-Datentyp für diese Werte ist int, es werden aber auch byte, sbyte, short, ushort, uint, long oder ulong verwendet werden. Erstellen wir eine Klasse mit einer Enumerations-Variablen, so wird dieser ein default-Wert zugewiesen. Dieser default-Wert ergibt sich aus dem default-Wert des zugrundeliegenden Datentyps, und das ist bei den für Enumerationen erlaubten Datentypen immer 0. Der default-Wert einer Enumeration ist somit nicht zwingend immer der erste definierte Wert – und auch nicht immer ein valider Enum-Wert!

Um dies zu verdeutlichen, erstellen wir uns mehrere Enumerationen, bei denen den einzelnen Werten unterschiedliche numerische Werte zugrunde gelegt werden.

   1: private enum EnumHello

   2: {

   3:     Hello, // wird mit 0 belegt

   4:     World  // wird mit 1 belegt

   5: }

   6: private enum EnumWorld

   7: {

   8:     Hello = -1,

   9:     World // wird mit 0 belegt

  10: }

Um die Zuweisung von default-Werte zu prüfen, erzeugen wir uns eine Klasse, die jeweils eine Property dieser Enumerationen hält.

   1: private class EnumTester

   2: {

   3:     public EnumHello Hello { get; set; }

   4:     public EnumWorld World { get; set; }

   5: }

Erstellen wir nun eine Instanz dieser Klasse und geben danach direkt die den Properties zugewiesene Werte aus, so sehen wir, dass immer der Wert mit dem zugrundeliegenden Wert 0 gesetzt ist.

   1: EnumTester test = new EnumTester();

   2:  

   3: Console.WriteLine(string.Format("default EnumHello: {0} ({1})", test.Hello, Enum.GetName(typeof(EnumHello), test.Hello)));

   4: Console.WriteLine(string.Format("default EnumWorld: {0} ({1})", test.World, Enum.GetName(typeof(EnumWorld), test.World)));

Doch was passiert nun, wenn wir keinen Enumerationswert zum Wert 0 haben?

Hierzu erstellen wir eine Enumeration, die bei 1 beginnt.

   1: private enum EnumUndefined

   2: {

   3:     Hello = 1,

   4:     World // wird mit 2 belegt

   5: }

Die Ausgabe auf der Konsole zeigt, dass dennoch der Wert 0 gesetzt ist, der ermittelte Name aber NULL ist.

image

Dies sollte bei der Erstellung von Enumerationen berücksichtigt werden. Es macht auch keinen Unterschied, ob wir eine Enumerations-Variable nicht initialisieren, oder den Wert über default(Enumeration) beziehen. Daher auch die Empfehlung von Microsoft, generell ein default-Element mit dem Wert 0 zu erstellt.