9.8 Nullable-Typen
Angenommen, Sie greifen auf das Feld einer Tabelle in einer Datenbank zu. Der Datentyp des Feldes sei ein Integer. Damit ist der zulässige Wertebereich des Feldes bereits exakt beschrieben, der zwischen dem Minimal- und dem Maximalwert des Integers liegt. Spalten einer Datenbanktabelle müssen aber nicht zwangsläufig mit einem durch den Datentyp beschriebenen Wert gefüllt sein, sie dürfen auch leer bleiben (haben also den Inhalt NULL) und werden trotzdem als gültig anerkannt. In diesem Fall ist neben einem Zahlenwert auch null akzeptiert. Das steht aber im Gegensatz zu der Vorgabe, dass ein Integer-Wert nicht durch null beschrieben werden kann.
Probleme dieser Art können nun ganz einfach durch Nullable-Typen gelöst werden. Dabei spielt der Typ Nullable<T>, der im Namespace System definiert ist, die entscheidende Rolle. Die Signatur deutet bereits an, dass es sich um eine generische Klasse handelt mit dem Ziel, einem Wertetyp die Verwendung von null zu ermöglichen. Die Definition lautet wie folgt:
Nullable<T> ist also als Struktur definiert und schränkt die Verwendung auf Strukturen ein. Das ist auch sinnvoll, da Referenztypen grundsätzlich durch null beschrieben werden können. Nullable<T> kann beispielsweise wie folgt verwendet werden:
Nullable<int> x = 4711;
Nullable<int> y = null;
C# verfügt darüber hinaus auch über eine eigene syntaktische Variante, die die Verwendung einfacher macht. Dafür wurde der neue Modifizierer »?« eingeführt, der aus einem Datentyp einen null-fähigen Typ macht. Damit kann die Notation der beiden Anweisungen auch vereinfachend wie folgt lauten:
int? x = 4711;
int? y = null;
Da wir es jetzt mit einem neuen Datentyp zu tun haben, der auch null unterstützt, wird in der Klasse Nullable mit HasValues eine Eigenschaft angeboten, die einen booleschen Wert beschreibt. Er ist true, wenn der Inhalt der null-fähigen Variablen einen gültigen Wert aufweist, also ungleich null ist.
if (x.HasValue)
Console.WriteLine("Der Wert ist ungleich null");
else
Console.WriteLine("Der Wert ist null");
Der Inhalt der Variablen kann mit der Eigenschaft Value abgefragt werden. Sie liefert einen gültigen Wert, wenn HasValue den Wert true liefert. Ansonsten wird eine Ausnahme vom Typ InvalidOperationException ausgelöst.
Darüber hinaus können Sie Nullable-Typen auch in der üblichen Form eines Referenztyps verwenden und beispielsweise mit null vergleichen:
if(x != null) {
...
}
9.8.1 Konvertierungen mit Nullable-Typen
Ein Nullable-Typ ist gegenüber seinem zugrunde liegenden Datentyp um die Fähigkeit erweitert worden, auch null zu unterstützen. Eine Zuweisung wie im folgenden Codefragment kommt einer aufweitenden Operation gleich und wird daher implizit vorgenommen.
int x = 20;
int? y = x;
Soll im umgekehrten Fall die Zuweisung eines null-fähigen Typs an seinen elementaren Typ erfolgen, muss explizit konvertiert werden.
int? x = 20;
int y = (int)x;
Hat x in diesem Beispiel den Inhalt null, wird eine Ausnahme ausgelöst.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.