Nullable Value Types (Visual Basic)
Ibland arbetar du med en värdetyp som inte har ett definierat värde under vissa omständigheter. Ett fält i en databas kan till exempel behöva skilja mellan att ha ett tilldelat värde som är meningsfullt och att inte ha ett tilldelat värde. Värdetyper kan utökas för att antingen ta sina normalvärden eller ett null-värde. Ett sådant tillägg kallas för en nullbar typ.
Varje nullbar värdetyp konstrueras från den allmänna Nullable<T> strukturen. Överväg en databas som spårar arbetsrelaterade aktiviteter. I följande exempel skapas en nullbar Boolean
typ och en variabel av den typen deklareras. Du kan skriva deklarationen på tre sätt:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
Variabeln ridesBusToWork
kan innehålla värdet True
, värdet False
, eller inget värde alls. Det ursprungliga standardvärdet är inget värde alls, vilket i det här fallet kan innebära att informationen ännu inte har hämtats för den här personen. Däremot False
kan det innebära att informationen har erhållits och att personen inte åker buss till jobbet.
Du kan deklarera variabler och egenskaper med nullbara värdetyper och du kan deklarera en matris med element av en nullbar värdetyp. Du kan deklarera procedurer med nullbara värdetyper som parametrar och du kan returnera en nullbar värdetyp från en Function
procedur.
Du kan inte konstruera en nullbar typ på en referenstyp, till exempel en matris, en String
eller en klass. Den underliggande typen måste vara en värdetyp. Mer information finns i Värdetyper och Referenstyper.
Använda en variabel av typen Null
De viktigaste medlemmarna i en nullbar värdetyp är dess HasValue och Value egenskaper. För en variabel av en nullbar värdetyp anger HasValue du om variabeln innehåller ett definierat värde. Om HasValue är True
kan du läsa värdet från Value. Observera att både HasValue och Value är ReadOnly
egenskaper.
Standardvärden
När du deklarerar en variabel med en nullbar värdetyp har dess HasValue egenskap ett standardvärde på False
. Det innebär att variabeln som standard inte har något definierat värde, i stället för standardvärdet för dess underliggande värdetyp. I följande exempel har variabeln numberOfChildren
inledningsvis inget definierat värde, även om standardvärdet för Integer
typen är 0.
Dim numberOfChildren? As Integer
Ett null-värde är användbart för att ange ett odefinierat eller okänt värde. Om numberOfChildren
hade deklarerats som Integer
skulle det inte finnas något värde som kan tyda på att informationen inte är tillgänglig för närvarande.
Lagra värden
Du lagrar ett värde i en variabel eller egenskap av en nullbar värdetyp på det vanliga sättet. I följande exempel tilldelas ett värde till variabeln numberOfChildren
som deklarerades i föregående exempel.
numberOfChildren = 2
Om en variabel eller egenskap av en nullbar värdetyp innehåller ett definierat värde kan du få den att återgå till sitt ursprungliga tillstånd att inte ha ett tilldelat värde. Du gör detta genom att ange variabeln eller egenskapen till Nothing
, som i följande exempel visas.
numberOfChildren = Nothing
Kommentar
Även om du kan tilldela Nothing
till en variabel av en nullbar värdetyp kan du inte testa den för Nothing
med hjälp av likhetstecknet. Jämförelse som använder likhetstecknet , someVar = Nothing
utvärderas alltid till Nothing
. Du kan testa variabelns HasValue egenskap för False
eller testa med hjälp av operatorn Is
eller IsNot
.
Hämtar värden
Om du vill hämta värdet för en variabel av en nullbar värdetyp bör du först testa dess HasValue egenskap för att bekräfta att den har ett värde. Om du försöker läsa värdet när HasValue är False
genererar Visual Basic ett InvalidOperationException undantag. I följande exempel visas det rekommenderade sättet att läsa variabeln numberOfChildren
för föregående exempel.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Jämföra typer av null-värden
När nullbara Boolean
variabler används i booleska uttryck kan resultatet vara True
, False
eller Nothing
. Följande är sanningstabellen för And
och Or
. Eftersom b1
och b2
nu har tre möjliga värden finns det nio kombinationer att utvärdera.
b1 | B2 | b1 och b2 | b1 eller 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 |
När värdet för en boolesk variabel eller ett uttryck är Nothing
är det varken true
eller false
. Betänk följande exempel.
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
I det här exemplet b1 And b2
utvärderas till Nothing
. Därför Else
körs -satsen i varje If
-instruktion och utdata är följande:
Expression is not true
Expression is not false
Kommentar
AndAlso
och OrElse
, som använder kortslutningsutvärdering, måste utvärdera sina andra operander när den första utvärderas till Nothing
.
Förökning
Om en eller båda operanderna i en aritmetik-, jämförelse-, skift- eller typåtgärd är en nullbar värdetyp, är resultatet av åtgärden också en nullbar värdetyp. Om båda operanderna har värden som inte Nothing
är utförs åtgärden på operandernas underliggande värden, som om ingen av dem var en nullbar värdetyp. I följande exempel skrivs variabler compare1
och sum1
implicit. Om du vilar muspekaren över dem ser du att kompilatorn härleder null-värdetyper för båda.
' 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}")
Om en eller båda operanderna har värdet Nothing
blir resultatet 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>")}")
Använda nullbara typer med data
En databas är en av de viktigaste platserna för att använda nullbara värdetyper. För närvarande har inte alla databasobjekt stöd för nullbara värdetyper, men det gör de designergenererade tabellkorten. Se TableAdapter-stöd för null-typer.