Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.