Typen null-waarden (Visual Basic)
Soms werkt u met een waardetype dat in bepaalde omstandigheden geen gedefinieerde waarde heeft. Een veld in een database moet bijvoorbeeld onderscheid maken tussen een toegewezen waarde die zinvol is en geen toegewezen waarde heeft. Waardetypen kunnen worden uitgebreid om hun normale waarden of een null-waarde te nemen. Een dergelijke extensie wordt een null-type genoemd.
Elk type null-waarde wordt samengesteld uit de algemene Nullable<T> structuur. Overweeg een database die werkgerelateerde activiteiten bijhoudt. In het volgende voorbeeld wordt een null-type Boolean
samengesteld en een variabele van dat type gede declareert. U kunt de declaratie op drie manieren schrijven:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
De variabele ridesBusToWork
kan een waarde bevatten van True
, een waarde van False
of helemaal geen waarde. De oorspronkelijke standaardwaarde is helemaal geen waarde, wat in dit geval kan betekenen dat de informatie nog niet voor deze persoon is verkregen. Het kan daarentegen False
betekenen dat de informatie is verkregen en dat de persoon niet met de bus rijdt om te werken.
U kunt variabelen en eigenschappen declareren met typen null-waarden en u kunt een matrix declareren met elementen van een type null-waarde. U kunt procedures declareren met typen null-waarden als parameters en u kunt een type null-waarde uit een Function
procedure retourneren.
U kunt geen null-type maken voor een verwijzingstype, zoals een matrix, een String
of een klasse. Het onderliggende type moet een waardetype zijn. Zie Waardetypen en referentietypen voor meer informatie.
Een variabele null-type gebruiken
De belangrijkste leden van een type null-waarde zijn HasValue de eigenschappen en Value eigenschappen. Voor een variabele van een type null-waarde geeft HasValue u aan of de variabele een gedefinieerde waarde bevat. Als HasValue dat het is True
, kunt u de waarde lezen van Value. Houd er rekening mee dat beide HasValue eigenschappen zijn ValueReadOnly
.
Standaardwaarden
Wanneer u een variabele declareert met een type null-waarde, heeft de HasValue eigenschap een standaardwaarde van False
. Dit betekent dat de variabele standaard geen gedefinieerde waarde heeft in plaats van de standaardwaarde van het onderliggende waardetype. In het volgende voorbeeld heeft de variabele numberOfChildren
aanvankelijk geen gedefinieerde waarde, ook al is de standaardwaarde van het Integer
type 0.
Dim numberOfChildren? As Integer
Een null-waarde is handig om een niet-gedefinieerde of onbekende waarde aan te geven. Als numberOfChildren
deze is gedeclareerd als Integer
, zou er geen waarde zijn die zou kunnen aangeven dat de informatie momenteel niet beschikbaar is.
Waarden opslaan
U slaat een waarde op in een variabele of eigenschap van een type null-waarde op de gebruikelijke manier. In het volgende voorbeeld wordt een waarde toegewezen aan de variabele numberOfChildren
die in het vorige voorbeeld is gedeclareerd.
numberOfChildren = 2
Als een variabele of eigenschap van een type null-waarde een gedefinieerde waarde bevat, kunt u ervoor zorgen dat deze wordt teruggezet naar de beginstatus van het niet toewijzen van een waarde. U doet dit door de variabele of eigenschap in te stellen op Nothing
, zoals in het volgende voorbeeld wordt weergegeven.
numberOfChildren = Nothing
Notitie
Hoewel u kunt toewijzen aan Nothing
een variabele van een type null-waarde, kunt u deze Nothing
niet testen met behulp van het gelijkteken. Vergelijking die gebruikmaakt van het gelijkteken, someVar = Nothing
wordt altijd geëvalueerd.Nothing
U kunt de eigenschap van HasValue de variabele testen of False
testen met behulp van de Is
of IsNot
operator.
Waarden ophalen
Als u de waarde van een variabele van een type null-waarde wilt ophalen, moet u eerst de eigenschap ervan testen HasValue om te bevestigen dat deze een waarde heeft. Als u de waarde probeert te lezen wanneer HasValue dit is False
, genereert Visual Basic een InvalidOperationException uitzondering. In het volgende voorbeeld ziet u de aanbevolen manier om de variabele numberOfChildren
van de vorige voorbeelden te lezen.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Null-typen vergelijken
Wanneer null-variabelen Boolean
worden gebruikt in Boole-expressies, kan True
het resultaat , False
of Nothing
. Hier volgt de waarheidstabel voor And
en Or
. Omdat b1
en b2
nu drie mogelijke waarden hebben, zijn er negen combinaties om te evalueren.
b1 | B2 | b1 en b2 | b1 of 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 |
Wanneer de waarde van een Booleaanse variabele of expressie is Nothing
, is dit noch true
false
. Bekijk het volgende voorbeeld.
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 dit voorbeeld b1 And b2
wordt geëvalueerd naar Nothing
. Als gevolg hiervan wordt de Else
component uitgevoerd in elke If
instructie en is de uitvoer als volgt:
Expression is not true
Expression is not false
Notitie
AndAlso
en OrElse
, die kortsluitingsevaluatie gebruiken, moeten hun tweede operanden evalueren wanneer de eerste wordt geëvalueerd Nothing
.
Voortplanting
Als een of beide operanden van een rekenkundige, vergelijkings-, dienst- of typebewerking een null-waardetype is, is het resultaat van de bewerking ook een type null-waarde. Als beide operanden waarden hebben die niet Nothing
zijn, wordt de bewerking uitgevoerd op de onderliggende waarden van de operanden, alsof ze geen null-waardetype zijn. In het volgende voorbeeld worden variabelen compare1
en sum1
impliciet getypt. Als u de muiswijzer erop plaatst, ziet u dat de compiler null-waardetypen voor beide afgeeft.
' 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}")
Als een of beide operanden een waarde Nothing
hebben, is Nothing
het resultaat.
' 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>")}")
Null-typen gebruiken met gegevens
Een database is een van de belangrijkste plaatsen om null-waardetypen te gebruiken. Niet alle databaseobjecten ondersteunen momenteel nullable waardetypen, maar de door de ontwerper gegenereerde tabeladapters wel. Zie TableAdapter-ondersteuning voor null-typen.