Typy o wartości zerowalnej (Visual Basic)
Czasami pracujesz z typem wartości, który nie ma zdefiniowanej wartości w pewnych okolicznościach. Na przykład pole w bazie danych może być konieczne odróżnienie od przypisanej wartości, która ma znaczenie, a 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 dopuszczalnym wartości null.
Każdy typ wartości dopuszczanej do wartości null jest konstruowany ze struktury ogólnej Nullable<T> . Rozważmy bazę danych, która śledzi działania związane z pracą. Poniższy przykład tworzy typ dopuszczający Boolean
wartość null 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.
Zmienne i właściwości można zadeklarować przy użyciu typów wartości dopuszczalnych wartości null, a tablicę można zadeklarować za pomocą elementów typu wartości dopuszczanej wartości null. Procedury można zadeklarować przy użyciu typów wartości dopuszczających wartość null jako parametrów i można zwrócić typ wartości dopuszczających wartość null z Function
procedury.
Nie można skonstruować typu dopuszczalnego wartości null dla typu odwołania, takiego jak tablica, String
klasa lub . Typ bazowy musi być typem wartości. Aby uzyskać więcej informacji, zobacz Typy wartości i typy referencyjne.
Używanie zmiennej typu dopuszczalnego wartości null
Najważniejszymi elementami członkowskimi typu wartości dopuszczanej do wartości null są jego HasValue właściwości i Value . W przypadku zmiennej typu wartości dopuszczanej do wartości null informuje, HasValue czy zmienna zawiera zdefiniowaną wartość. Jeśli HasValue wartość to True
, możesz odczytać wartość z .Value Należy pamiętać, że właściwości i HasValueValue są ReadOnly
.
Wartości domyślne
Po zadeklarowaniu zmiennej z typem wartości dopuszczanej wartości null jej HasValue właściwość ma wartość False
domyślną . Oznacza to, że domyślnie zmienna nie ma zdefiniowanej wartości, a nie domyślnej wartości jej typu wartości bazowej. 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
Wartość jest przechowywana w zmiennej lub właściwości typu wartości dopuszczanej do wartości null 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 dopuszczanej do wartości null zawiera zdefiniowaną wartość, może to spowodować przywrócenie początkowego stanu braku przypisanej wartości. W tym celu należy ustawić zmienną lub właściwość na Nothing
wartość , jak pokazano w poniższym przykładzie.
numberOfChildren = Nothing
Uwaga
Mimo że można przypisać Nothing
do zmiennej typu wartości dopuszczanej wartości null, nie można go Nothing
przetestować 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 przetestować dla False
elementu lub przy użyciu Is
operatora or 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ść w przypadku HasValue wartości , 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 dopuszczane Boolean
do wartości null są używane w wyrażeniach logicznych, wynik może mieć True
wartość , 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
false
. Rozważmy następujący 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
funkcja oblicza wartość 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
AndAlso
i OrElse
, które używają oceny zwarciowej, muszą ocenić ich drugie operandy, gdy pierwszy zwróci wartość Nothing
.
Propagacja
Jeśli jeden lub oba operandy operacji arytmetycznej, porównania, przesunięcia lub typu jest typem wartości dopuszczającym wartość null, wynik operacji jest również typem wartości dopuszczającym wartość null. Jeśli oba operandy mają wartości, które nie Nothing
są , operacja jest wykonywana na podstawowych wartościach operandów, tak jakby żadna z nich nie była typem wartości dopuszczanej do wartości null. W poniższym przykładzie zmienne compare1
i sum1
są niejawnie wpisywane. Jeśli odłożysz wskaźnik myszy na nich, zobaczysz, że kompilator wywnioskuje typy wartości dopuszczających wartość null dla obu z nich.
' 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 dopuszczanych do wartości null. Nie wszystkie obiekty bazy danych obsługują obecnie typy wartości dopuszczanych do wartości null, ale karty tabel generowane przez projektanta. Zobacz Obsługa funkcji TableAdapter dla typów dopuszczanych do wartości null.
Zobacz też
- InvalidOperationException
- HasValue
- Data types (Typy danych)
- Typy wartości i odwołań
- Rozwiązywanie problemów związanych z typami danych
- Wypełnianie zestawów danych za pomocą adapterów TableAdapter
- If, operator
- Wnioskowanie o typie lokalnym
- Is, operator
- IsNot, operator
- Typy wartości dopuszczalnych wartości null (C#)