Typy hodnot s povolenou hodnotou Null (Visual Basic)
Někdy pracujete s typem hodnoty, který za určitých okolností nemá definovanou hodnotu. Například pole v databázi může muset rozlišovat mezi přiřazenou hodnotou, která má smysl a nemá přiřazenou hodnotu. Typy hodnot lze rozšířit tak, aby převzaly jejich normální hodnoty nebo hodnotu null. Takové rozšíření se nazývá typ s možnou hodnotou null.
Každý typ hodnoty s možnou hodnotou null je vytvořen z obecné Nullable<T> struktury. Zvažte databázi, která sleduje aktivity související s prací. Následující příklad vytvoří typ s možnou Boolean
hodnotou null a deklaruje proměnnou tohoto typu. Deklaraci můžete napsat třemi způsoby:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
Proměnná ridesBusToWork
může obsahovat hodnotu True
, hodnotu False
nebo žádnou hodnotu vůbec. Počáteční výchozí hodnota není vůbec žádná hodnota, což v tomto případě může znamenat, že informace dosud nebyly získány pro tuto osobu. Naproti tomu může znamenat, False
že informace byly získány a osoba neodjíždí autobusem do práce.
Můžete deklarovat proměnné a vlastnosti s typy hodnot null a můžete deklarovat pole s prvky typu hodnoty nullable. Můžete deklarovat procedury s typy hodnot s možnou Function
hodnotou null jako parametry a můžete vrátit typ hodnoty null z procedury.
Nelze vytvořit typ s možnou hodnotou null pro odkazový typ, například pole, a String
nebo třídu. Podkladový typ musí být typ hodnoty. Další informace naleznete v tématu Typy hodnot a odkazové typy.
Použití proměnné typu s možnou hodnotou Null
Nejdůležitější členy typu hodnoty s možnou hodnotou null jsou jeho HasValue a Value vlastnosti. U proměnné typu hodnoty s možnou hodnotou null zjistíte, HasValue jestli proměnná obsahuje definovanou hodnotu. Pokud HasValue je True
, můžete přečíst hodnotu z Value. Všimněte si, že obě HasValue a Value jsou ReadOnly
vlastnosti.
Výchozí hodnoty
Když deklarujete proměnnou s typem hodnoty null, jeho HasValue vlastnost má výchozí hodnotu False
. To znamená, že proměnná ve výchozím nastavení nemá žádnou definovanou hodnotu místo výchozí hodnoty základního typu hodnoty. V následujícím příkladu proměnná numberOfChildren
zpočátku nemá žádnou definovanou hodnotu, i když je výchozí hodnota Integer
typu 0.
Dim numberOfChildren? As Integer
Hodnota null je užitečná k označení nedefinované nebo neznámé hodnoty. Pokud numberOfChildren
by byla deklarována jako Integer
, nebyla by žádná hodnota, která by mohla znamenat, že informace nejsou aktuálně k dispozici.
Ukládání hodnot
Hodnotu uložíte v proměnné nebo vlastnosti typu hodnoty null obvyklým způsobem. Následující příklad přiřadí hodnotu proměnné numberOfChildren
deklarované v předchozím příkladu.
numberOfChildren = 2
Pokud proměnná nebo vlastnost typu hodnoty null obsahuje definovanou hodnotu, můžete ji způsobit, že se vrátí k počátečnímu stavu, kdy není přiřazena hodnota. Provedete to nastavením proměnné nebo vlastnosti na Nothing
, jak ukazuje následující příklad.
numberOfChildren = Nothing
Poznámka:
I když můžete přiřadit Nothing
proměnné typu hodnoty null, nemůžete ji Nothing
otestovat pomocí rovnítku. Porovnání, které používá rovnítko, someVar = Nothing
, vždy vyhodnotí na Nothing
. Vlastnost proměnné HasValue můžete otestovat nebo False
otestovat pomocí operátoru nebo IsNot
operátoruIs
.
Načítání hodnot
Pokud chcete načíst hodnotu proměnné typu hodnoty null, měli byste nejprve otestovat její HasValue vlastnost a ověřit, zda má hodnotu. Pokud se pokusíte přečíst hodnotu, pokud HasValue je False
, Visual Basic vyvolá InvalidOperationException výjimku. Následující příklad ukazuje doporučený způsob čtení proměnné numberOfChildren
předchozích příkladů.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Porovnání typů s možnou hodnotou Null
Při použití proměnných s možnou Boolean
hodnotou null ve výrazech logických hodnot může být True
výsledek , False
nebo Nothing
. Následuje tabulka pravdy pro And
a Or
. Vzhledem k tomu b1
, že teď b2
mají tři možné hodnoty, existuje devět kombinací, které se mají vyhodnotit.
b1 | B2 | b1 A b2 | b1 Nebo 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 |
Pokud je Nothing
hodnota logické proměnné nebo výrazu , není true
false
ani . Představte si následující příklad.
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
V tomto příkladu b1 And b2
se vyhodnotí jako Nothing
. V důsledku toho Else
se klauzule provádí v každém If
příkazu a výstup je následující:
Expression is not true
Expression is not false
Poznámka:
AndAlso
a OrElse
, které používají vyhodnocení zkratového okruhu, musí vyhodnotit jejich druhý operand při prvním vyhodnocení na Nothing
.
Šíření
Pokud jeden nebo oba operandy aritmetické operace, porovnání, posunu nebo typu je typ hodnoty null, je výsledkem operace také typ hodnoty nullable. Pokud oba operandy mají hodnoty, které nejsou Nothing
, operace se provádí s podkladovými hodnotami operandů, jako by ani jeden z nich nebyl typ hodnoty null. V následujícím příkladu jsou proměnné compare1
a sum1
implicitně zadány. Pokud nad nimi umístíte ukazatel myši, uvidíte, že kompilátor odvodí typy hodnot s možnou hodnotou null pro oba.
' 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}")
Pokud jeden nebo oba operandy mají hodnotu Nothing
, výsledek bude 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>")}")
Použití typů s možnou hodnotou Null s daty
Databáze je jedním z nejdůležitějších míst pro použití typů hodnot s možnou hodnotou null. Ne všechny databázové objekty aktuálně podporují typy hodnot s možnou hodnotou null, ale adaptéry tabulek generované návrhářem. Viz Podpora tableAdapter pro typy s možnou hodnotou null.