Auf NULL festlegbare Werttypen (Visual Basic)

Manchmal arbeiten Sie mit einem Werttyp, der unter bestimmten Umständen keinen definierten Wert aufweist. Ein Feld in einer Datenbank muss z. B. zwischen einem zugewiesenen Wert unterscheiden, der aussagekräftig ist und keinen zugewiesenen Wert aufweist. Werttypen können erweitert werden, um entweder ihre normalen Werte oder einen Nullwert zu verwenden. Eine solche Erweiterung wird als Null-Typ bezeichnet.

Jeder Nullwertetyp wird aus der generischen Nullable<T>-Struktur erstellt. Betrachten Sie eine Datenbank, die arbeitsbezogene Aktivitäten nachverfolgt. Im folgenden Beispiel wird ein null-Boolean-Typ erstellt und eine Variable dieses Typs deklariert. Sie können die Deklaration auf drei Arten schreiben:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

Die Variable ridesBusToWork kann einen Wert von True, einen Wert von Falseoder gar keinen Wert enthalten. Der anfängliche Standardwert ist überhaupt kein Wert, was in diesem Fall bedeuten könnte, dass die Informationen für diese Person noch nicht abgerufen wurden. Im Gegensatz dazu könnte False bedeuten, dass die Informationen erhalten wurden und die Person nicht mit dem Bus fährt, um zu arbeiten.

Sie können Variablen und Eigenschaften mit Nullwerttypen deklarieren, und Sie können ein Array mit Elementen eines Nullwertetyps deklarieren. Sie können Prozeduren mit Nullwerttypen als Parameter deklarieren und einen Nullwertetyp aus einer Function Prozedur zurückgeben.

Sie können keinen nullfähigen Typ für einen Verweistyp erstellen, z. B. ein Array, eine String oder eine Klasse. Der zugrunde liegende Typ muss ein Werttyp sein. Weitere Informationen finden Sie unter Value Types and Reference Types.

Verwenden einer Nullable-Typvariablen

Die wichtigsten Elemente eines Nullwerttyps sind die zugehörigen HasValue und Value Eigenschaften. Bei einer Variablen eines Nullwerttyps gibt HasValue an, die Variable einen definierten Wert enthält. Wenn HasValueTrue ist, können Sie den Wert von Value lesen. Beachten Sie, dass HasValue und ValueReadOnly-Eigenschaften sind .

Standardwerte

Wenn Sie eine Variable mit einem Nullwerttyp deklarieren, hat die HasValue Eigenschaft einen Standardwert von False. Dies bedeutet, dass die Variable standardmäßig keinen definierten Wert anstelle des Standardwerts des zugrunde liegenden Werttyps aufweist. Im folgenden Beispiel weist die Variable numberOfChildren zunächst keinen definierten Wert auf, obwohl der Standardwert des Integer Typs 0 ist.

Dim numberOfChildren? As Integer

Ein Nullwert ist nützlich, um einen nicht definierten oder unbekannten Wert anzugeben. Wenn numberOfChildren als Integerdeklariert worden wäre, wäre kein Wert vorhanden, der darauf hindeuten könnte, dass die Informationen zurzeit nicht verfügbar sind.

Speichern von Werten

Sie speichern einen Wert in einer Variablen oder Eigenschaft eines Nullwertetyps auf typische Weise. Im folgenden Beispiel wird der im vorherigen Beispiel deklarierten Variablen numberOfChildren ein Wert zugewiesen.

numberOfChildren = 2

Wenn eine Variable oder Eigenschaft eines nullablen Werttyps einen definierten Wert enthält, können Sie dazu führen, dass sie auf den Anfangszustand zurückgesetzt wird, dem kein Wert zugewiesen ist. Dazu legen Sie die Variable oder Eigenschaft wie im folgenden Beispiel dargestellt auf Nothing fest.

numberOfChildren = Nothing

Hinweis

Obwohl Sie einer Variablen eines Nullwerttyps zuweisen Nothing können, können Sie sie für Nothing nicht mithilfe des Gleichheitszeichens testen. Vergleich, der das Gleichheitszeichen verwendet, someVar = Nothing wird immer zu Nothing ausgewertet. Sie können die Eigenschaft HasValue der Variablen für False mithilfe des Is oder IsNot Operators testen.

Abrufen von Werten

Um den Wert einer Variablen eines Nullwerttyps abzurufen, sollten Sie zuerst die HasValue Eigenschaft testen, um zu bestätigen, dass sie einen Wert aufweist. Wenn Sie versuchen, den Wert zu lesen, wenn HasValueFalse ist, löst Visual Basic eine InvalidOperationException Ausnahme aus. Das folgende Beispiel zeigt die empfohlene Methode zum Lesen der Variablen numberOfChildren der vorherigen Beispiele.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Vergleich nullfähiger Typen

Wenn nullfähige Boolean Variablen in booleschen Ausdrücken verwendet werden, kann das Ergebnis True, False oder Nothing sein. Es folgt die Wahrheitstabelle für And und Or. Da b1 und b2 jetzt drei mögliche Werte haben, gibt es neun Kombinationen, die ausgewertet werden sollen.

b1 b2 b1 And b2 b1 Or b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

Wenn der Wert einer booleschen Variablen oder eines Ausdrucks lautet Nothing, ist er weder true noch false. Betrachten Sie das folgende Beispiel.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

In diesem Beispiel wird b1 And b2 ausgewertet zu Nothing. Daher wird die Else Klausel in jeder If Anweisung ausgeführt, und die Ausgabe lautet wie folgt:

Expression is not true

Expression is not false

Hinweis

AndAlso und OrElse, die Kurzschlussauswertung verwenden, müssen ihre zweiten Operanden auswerten, wenn die erste zu Nothing ausgewertet wird.

Weitergabe

Wenn einer oder beide Operanden eines Arithmetik-, Vergleichs-, Schicht- oder Typvorgangs ein Nullwerttyp ist, ist das Ergebnis des Vorgangs auch ein Nullwerttyp. Wenn beide Operanden Werte haben, die nicht Nothingsind, wird der Vorgang für die zugrunde liegenden Werte der Operanden ausgeführt, als wäre keines der Nullwertetyp. Im folgenden Beispiel werden Variablen compare1 und sum1 implizit eingegeben. Wenn Sie mit dem Mauszeiger darauf zeigen, sehen Sie, dass der Compiler nullable Werttypen für beide ableiten kann.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

Wenn ein oder beide Operanden einen Wert von Nothing haben, lautet Nothing das Ergebnis .

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Verwenden nullabler Typen mit Daten

Eine Datenbank ist eine der wichtigsten Orte, an denen Nullwerte verwendet werden können. Nicht alle Datenbankobjekte unterstützen derzeit Nullwertetypen, aber die vom Designer generierten Tabellenadapter führen dies aus. Siehe TableAdapter-Unterstützung für nullwerte Typen.

Siehe auch