Nullwerte für Wertetypen

Im .NET Framework sind Datentypen entweder Wertetypen oder Referenztypen. Wertetypen haben grundsätzlich einen Standardkonstruktor, der dafür sorgt, dass alle Member-Variablen mit ihrem Standardwert initialisiert werden. Als Standardwert wird dabei auf Speicherebene der Wert 0 verstanden. Es ist generell nicht möglich, für Wertetypen einen Standardkonstruktor zu implementieren.

Variablen eines Wertetyps nehmen die entsprechenden Werte immer direkt auf, also ohne irgendeine Referenz. Daher kann ein Wertetyp nicht auf Null gesetzt werden. Die normale Übergabe eines Wertetyps an eine Funktion erfolgt immer durch das Anlegen einer Kopie des zu übergebenden Wertes auf dem Stack (Call by Value). Durch die Zuweisung von Wertetypen werden ebenfalls Kopien erzeugt.

Datenbanken unterstützten je nach Spaltendefinition neben Werten des jeweiligen Datentyps auch einen Nullwert (siehe DBNull.Value). Der Versuch, eine derartige Spaltendefinition mit einem Wertetyp abzubilden, scheitert an der Restriktion, dass Wertetypen immer einen Wert haben. Aus diesem Grund stellt das .NET Framework die generische Klasse Nullable<T> zur Verfügung, die ihrerseits ebenfalls ein Wertetyp ist, jedoch aufgrund entsprechender Umwandlungsoperatoren nicht der Restriktion bezüglich der Zuweisung von Nullwerten unterliegt.

Nullable<int> x=null;
Nullable<int> y=1;

In C# kann die Kurzform wie folgt verwendet werden:

int? x=null;
int? y=1;

Der Datentyp T ist implizit mit T? zuweisungskompatibel. T? ist jedoch nur durch eine explizite Typumwandlung mit T kompatibel. Anstelle der expliziten Typumwandlung kann die Eigenschaft Value verwendet werden. Enthält das Objekt keinen Wert, wird für beide Varianten eine Ausnahme ausgelöst.

int i=1;
int? x=i;

int j=(int)x;
int k=x.Value;

Für die Prüfung, ob ein Objekt einen Wert enthält, dient die Eigenschaft HasValue. Der direkte Vergleich mit Null ist ebenso möglich. Jedoch ist dieser Weg nicht so effizient.

Ähnliche Artikel

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.