Delen via


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 Falseof 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 Stringof 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 = Nothingwordt altijd geëvalueerd.Nothing U kunt de eigenschap van HasValue de variabele testen of Falsetesten 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 Truehet resultaat , Falseof 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 truefalse. 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 Nothingzijn, 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 Nothinghebben, is Nothinghet 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.

Zie ook