Sdílet prostřednictvím


Nulovatelné typy hodnot (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 hodnotovými typy s možnou hodnotou null jako parametry a můžete vrátit hodnotový typ s možnou hodnotou null z procedury Function.

Nelze vytvořit typ, který může nabývat hodnotu null, pro odkazový typ, například pole, 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é nulovatelného typu

Nejdůležitější členy typu hodnoty s možnou hodnotou null jsou jeho HasValue a Value vlastnosti. U proměnné nulovatelného hodnotového typu zjistíte, HasValue zda 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 umožňující null, nemůžete provést test na Nothing pomocí operátoru rovnosti. Porovnání, které používá rovnítko, someVar = Nothing, se vždy vyhodnotí jako Nothing. Vlastnost proměnné HasValue můžete otestovat pro False nebo otestovat pomocí operátoru Is nebo IsNot.

Získává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 podporou hodnoty null

Při použití proměnných typu Boolean ve logických výrazech může být výsledek True, False nebo Nothing. Následuje tabulka pravdy pro And a Or. Vzhledem k tomu, že b1 a b2 teď mají tři možné hodnoty, je třeba vyhodnotit devět kombinací.

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 hodnota logické proměnné nebo výrazu Nothing, není ani true ani false. Podívejte se na 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 se podmínka Else 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í krátkého spojení, musí vyhodnotit svůj druhý operand, když první operand je 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í nepovinně hodnotných typů 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. Aktuálně ne všechny databázové objekty podporují nulovatelné typy hodnot, ale adaptéry tabulek generované návrhářem ano. Viz Podpora TableAdapteru pro typy s možnou hodnotou null.

Viz také