Udostępnij za pośrednictwem


Typy wartości dopuszczających null (Visual Basic)

Czasami pracujesz z typem wartości, który nie ma zdefiniowanej wartości w pewnych okolicznościach. Na przykład, konieczne może być odróżnienie, czy pole w bazie danych ma przypisaną wartość, która jest znacząca, czy nie ma przypisanej wartości. Typy wartości można rozszerzyć w celu uwzględnienia ich normalnych wartości lub wartości null. Takie rozszerzenie jest nazywane typem nullable.

Każdy typ wartości, który może mieć wartość null, jest konstruowany ze struktury generycznej Nullable<T>. Rozważmy bazę danych, która śledzi działania związane z pracą. Poniższy przykład tworzy typ dopuszczający wartość null Boolean i deklaruje zmienną tego typu. Deklarację można napisać na trzy sposoby:

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

Zmienna ridesBusToWork może przechowywać wartość True, wartość Falselub żadną wartość w ogóle. Początkowa wartość domyślna nie jest w ogóle wartością, co w tym przypadku może oznaczać, że informacje nie zostały jeszcze uzyskane dla tej osoby. Natomiast może oznaczać, False że informacje zostały uzyskane, a osoba nie jeździ autobusem do pracy.

Można zadeklarować zmienne i właściwości przy użyciu typów wartości dopuszczających wartości null, a także zadeklarować tablicę z elementami typu wartości dopuszczającego wartości null. Procedury można zadeklarować przy użyciu typów wartości nullable jako parametry i można zwrócić typ wartości nullable z procedury Function.

Nie można skonstruować typu dopuszczalnego wartości null dla typu odwołania, takiego jak tablica, klasa, String, lub inny obiekt. Typ bazowy musi być typem wartości. Aby uzyskać więcej informacji, zobacz Typy wartości i typy referencyjne.

Używanie typu zmiennej nullable

Najważniejszymi elementami członkowskimi typu wartości dopuszczającego wartości null są jego właściwości HasValue i Value. W przypadku zmiennej typu wartości możliwej do zdefiniowania jako null, HasValue informuje, czy zmienna zawiera zdefiniowaną wartość. Jeśli HasValue jest True, możesz odczytać wartość z Value. Należy pamiętać, że zarówno HasValue, jak i Value są właściwościami ReadOnly.

Wartości domyślne

Po zadeklarowaniu zmiennej z typem wartości dopuszczającym null jej właściwość HasValue ma wartość domyślną False. Oznacza to, że domyślnie zmienna nie ma określonej wartości, zamiast domyślnej wartości typu, na którym jest oparta. W poniższym przykładzie zmienna numberOfChildren początkowo nie ma zdefiniowanej wartości, mimo że wartość Integer domyślna typu to 0.

Dim numberOfChildren? As Integer

Wartość null jest przydatna do wskazywania niezdefiniowanej lub nieznanej wartości. Jeśli numberOfChildren został zadeklarowany jako Integer, nie będzie żadnej wartości, która może wskazywać, że informacje nie są obecnie dostępne.

Przechowywanie wartości

Przechowuj wartość w zmiennej lub właściwości typu wartości nulowalnej w typowy sposób. Poniższy przykład przypisuje wartość do zmiennej numberOfChildren zadeklarowanej w poprzednim przykładzie.

numberOfChildren = 2

Jeśli zmienna lub właściwość typu wartości dopuszczającej wartość null zawiera określoną wartość, możesz spowodować jej powrót do stanu początkowego, w którym żadna wartość nie jest przypisana. W tym celu należy ustawić zmienną lub właściwość na wartość Nothing, jak pokazano w poniższym przykładzie.

numberOfChildren = Nothing

Uwaga / Notatka

Mimo że można przypisać Nothing do zmiennej typu wartości dopuszczającego null, nie można jej testować dla Nothing przy użyciu znaku równości. Porównanie, które używa znaku równości, someVar = Nothing, zawsze daje wartość Nothing. Właściwość zmiennej HasValue można sprawdzić dla False, albo przetestować, używając operatora Is lub IsNot.

Pobieranie wartości

Aby pobrać wartość zmiennej typu wartości dopuszczanej do wartości null, należy najpierw przetestować jego HasValue właściwość, aby potwierdzić, że ma wartość. Jeśli spróbujesz odczytać wartość HasValue kiedy False, program Visual Basic zgłosi InvalidOperationException wyjątek. Poniższy przykład przedstawia zalecany sposób odczytywania zmiennej numberOfChildren z poprzednich przykładów.

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

Porównywanie typów dopuszczanych do wartości null

Gdy zmienne uwzględniające możliwość wartości null Boolean są używane w wyrażeniach logicznych, wynik może być True, False lub Nothing. Poniżej znajduje się tabela prawdy dla And i Or. Ponieważ b1 i b2 teraz mają trzy możliwe wartości, istnieje dziewięć kombinacji do obliczenia.

b1 b2 b1 i b2 b1 lub 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

Gdy wartość zmiennej logicznej lub wyrażenia to Nothing, nie jest to ani true ani false. Rozważmy poniższy przykład.

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

W tym przykładzie b1 And b2 ocenia się jako Nothing. W rezultacie klauzula Else jest wykonywana w każdej If instrukcji, a dane wyjściowe są następujące:

Expression is not true

Expression is not false

Uwaga / Notatka

AndAlso i OrElse, które używają oceny zwarciowej, muszą ocenić swoje drugie operandy, gdy pierwszy oceni się na Nothing.

Propagacja

Jeśli jeden lub oba operandy operacji arytmetycznej, porównania, przesunięcia lub typu są typem wartości obsługującym wartości null, wynik operacji jest również typem wartości obsługującym wartości null. Jeśli oba operandy mają wartości, które nie są Nothing, operacja jest wykonywana na podstawowych wartościach operandów tak, jak gdyby żaden z nich nie był typem wartości dopuszczającej wartości null. W poniższym przykładzie zmienne compare1 i sum1 są niejawnie wpisywane. Jeśli przesuniesz wskaźnik myszy nad nimi, zobaczysz, że kompilator wywnioskuje typy wartości nullable dla obu.

' 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}")

Jeśli jeden lub oba operandy mają wartość Nothing, wynikiem będzie Nothing.

' 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>")}")

Używanie typów dopuszczanych do wartości null z danymi

Baza danych jest jednym z najważniejszych miejsc do używania typów wartości, które mogą przyjmować wartość null. Nie wszystkie obiekty bazy danych obecnie obsługują typy wartości podatne na null, ale adaptery tabel generowane przez projektanta tak. Zobacz Wsparcie TableAdapter dla typów dopuszczających wartości null.

Zobacz także