Nullable Types

Aus Das Sopra Wiki
Wechseln zu: Navigation, Suche


Nullable Types können in C# dazu verwendet werden um den normalen Wertebereich von Value Types um den Wert null zu erweitern. Normalerweise können nur Reference Types null sein.

Als Beispiel für den Nutzen von Nullable Types kann man eine Variable vom Typ bool betrachten. Standardmäßig kann diese nur zwei Werte annehmen: true und false. Es gibt keinen Wert mit dem ein undefined ausgedrückt werden könnte. Allerdings ist es bei vielen Datenbanken möglich, dass ein Feld entweder den Wert true oder den Wert false oder gar keinen Wert enthält. Durch Nullabe Types lassen sich solche Szenarien bewältigen. Analog können Nullable Types auch dazu verwendet werden, um Value Types genauso wie Reference Types auf null zu setzen, um anzugeben, dass sie noch nicht initialisiert sind.

Funktionsweise

Nullable Types sind Instanzen des generischen Structs System.Nullable. Ein Nullable Type kann den normalen Wertebereich seines unterliegenden Value Types plus dem zusätzlichen null-Wert annehmen. Zum Beispiel kann einem Nullable<Int32>, ausgesprochen "Nullable of Int32", jeder Wert von -2147483648 bis 2147483647 oder der Wert null zugewiesen werden. Einem Nullable<bool> können die Werte true oder false oder null zugewiesen werden.

Überblick über die Verwendung

Nullable Types haben die folgenden Eigenschaften:

  • Der Syntax T? ist eine Abkürzung für System.Nullable<T>, wobei T ein Value Type ist. Diese beiden Schreibweisen sind untereinander austauschbar.
int? x = 10;
double? d = 4.108;
float? f = null;
Nullable<int> z = x;
  • Die Property System.Nullable.GetValueOrDefault kann dazu verwendet werden um entweder den zugewiesenen Wert, oder den Standardwert des unterliegenden Typs zu bekommen falls die Variable den Wert null hat, z.B.:
int y = x.GetValueOrDefault();
float g = f.GetValueOrDefault();
  • Man verwendet die Properties HasValue und Value um einen Nullable Type auf null zu testen und den Wert abzufragen, z.B.:
if (x.HasValue)
{
  y = x.Value
}
  • Die HasValue Property liefert true wenn die Variable einen Wert enthält oder false wenn sie null ist.
  • Die Value Property liefert einen Wert wenn einer zugewiesen wurde, ansonsten wird eine System.InvalidOperationException geworfen.
  • Standardmäßig wird HasValue bei einem Nullable Type auf false gesetzt, Value ist nicht definiert.
  • Der ??-Operator kann verwendet werden um einen Standardwert zuzuweisen, falls ein Nullable Type, dessen aktueller Wert null ist, einem Non-Nullable Type zugewiesen wird, z.B.:
int? x = null;
int y = x ?? -1;
  • Nullable Types können nicht geschachtelt werden. Das folgende Beispiel wird nicht kompilieren:
Nullable<Nullable<int>> n; //Error: The type 'int?' must be a non-nullable value type in order to use
                           //it as parameter 'T' in the generic type or method 'System.Nullable<T>'

Beispielanwendung in XNA

Nullable Types werden in XNA zum Beispiel für die Methode Intersect des Structs Ray verwendet. Der Rückgabewert von Intersect ist vom Typ Nullable<float> um entweder die Distanz des Schnittpunkts auf dem Strahl zurückzugeben oder null, falls es keinen Schnitpunkt gibt. Um zu bestimmen, ob ein Strahl eine Kugel schneidet, kann folgender Beispielcode verwendet werden (der außerdem auch eine Anwendung eines Rückgabeparameters zeigt):

Ray ray = new Ray(Vector3.Zero, Vector3.UnitX); //a ray from the origin along the x-axis
BoundingSphere sphere = new BoundingSphere(new Vector3(5.0f, 0.0f, 0.0f), 1.0f); //a sphere with origin (5, 0, 0) and radius 1

float? intersectionDistance;

ray.Intersects(ref sphere, out intersectionDistance);

if (intersectionDistance.HasValue)
{
  System.Console.WriteLine("Ray intersects Sphere!");
}
else
{
  System.Console.WriteLine("Ray does not intersect Sphere!");
}

Referenzen und weiterführende Informationen

  1. MSDN Programming Guide zu Nullable Types
  2. MSDN Programming Guide zur Verwendung von Nullable Types
  3. MSDN Programming Guide zum Boxing von Nullable Types
  4. MSDN Artikel zur Ray Structure