Dela via


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 Stringeller 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 Truekan 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 Integerskulle 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 = Nothingutvärderas alltid till Nothing. Du kan testa variabelns HasValue egenskap för Falseeller 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 Falsegenererar 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, Falseeller 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 Nothingblir 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.

Se även