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ść 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.

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, Stringklasa 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 HasValueValueReadOnly .

Wartości domyślne

Po zadeklarowaniu zmiennej z typem wartości dopuszczanej wartości null jej HasValue właściwość ma wartość Falsedomyś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 Nothingwartość , 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 Falseelementu 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 , Falseprogram 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ć Truewartość , Falselub 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 truefalse. 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 Nothingsą , 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ż