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 Falsenebo žá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 Stringnebo 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 Falseotestovat 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 Truevýsledek , Falsenebo 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 Nothinghodnota logické proměnné nebo výrazu , není truefalseani . 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.

Viz také