Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ść False
lub ż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.