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.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří znají aspoň jeden programovací jazyk a učí se jazyk C#. Pokud s programováním teprve začínáte, začněte nejprve kurzy Začínáme . Další podrobnosti najdete v tématu Nepovinné typy hodnot v dokumentaci jazyka.
Nulovatelný typ hodnotyT? představuje všechny hodnoty svého Tzákladního hodnotového typu, plus jednu další hodnotu null. Proměnná typu int? obsahuje jakékoli celé číslo nebo null představuje "žádnou hodnotu".
Typy hodnot, jako jsou int, bool a DateTime, nemohou ve výchozím nastavení uchovávat null. Toto chování je efektivní a zabraňuje mnoha chybám. Toto omezení však vytvoří problém, když hodnota může skutečně chybět. Běžným scénářem je čtení z databáze: celočíselná sloupec může obsahovat číslo nebo nemusí obsahovat vůbec žádnou hodnotu (NULL v SQL). Prostý int nemůže tuto nepřítomnost reprezentovat, ale int? může.
Deklarace nulovatelného typu hodnoty
Připojte ? k libovolnému typu hodnoty, aby byl nulovatelný.
int? age = null; // integer with no value yet
double? price = 9.99; // nullable double with a value
bool? isActive = null; // boolean with no value
age = 30; // assign a value later
int?[] scores = [100, null, 85, null, 72]; // array with absent entries
Výchozí hodnota nulovatelného typu hodnoty je null, nikoli výchozí hodnota podkladového typu.
Kontrola přítomnosti hodnoty
Doporučený způsob, jak zkontrolovat typ hodnoty null a extrahovat jeho hodnotu, je se vzorem typu:
int? temperature = 72;
if (temperature is int degrees)
{
Console.WriteLine($"Temperature is {degrees}°F.");
}
else
{
Console.WriteLine("Temperature is not recorded.");
}
// Output: Temperature is 72°F.
Vzor is int degrees odpovídá pouze v případě, že temperature není null, a současně vytvoří vazbu hodnoty na degrees. V jednom kroku získáte kontrolu null i extrahování hodnot.
Alternativně použijte vlastnosti HasValue a Value.
int? count = 42;
if (count.HasValue)
{
Console.WriteLine($"Count is {count.Value}.");
}
else
{
Console.WriteLine("Count has no value.");
}
// Output: Count is 42.
Preferujte is T value vzor pro nový kód. Zavádí novou nenulovou proměnnou omezenu na odpovídající větev, což zvyšuje srozumitelnost záměru a eliminuje veškeré pokušení náhodného použití Value mimo kontrolu na null, kde by byla vyvolána výjimka InvalidOperationException.
Můžete také porovnat přímo s null:
int? quantity = null;
if (quantity != null)
{
Console.WriteLine($"Quantity: {quantity.Value}");
}
else
{
Console.WriteLine("Quantity is not set.");
}
// Output: Quantity is not set.
Získání hodnoty pomocí náhradní lokality
Pokud potřebujete nenullovou hodnotu z nullable hodnoty, použijte GetValueOrDefault nebo operátor null-koalescence ??:
int? rating = null;
int result1 = rating.GetValueOrDefault(); // 0 (default for int)
int result2 = rating.GetValueOrDefault(-1); // -1 (specified fallback)
Console.WriteLine(result1); // 0
Console.WriteLine(result2); // -1
rating = 5;
int result3 = rating.GetValueOrDefault(-1); // 5 (actual value)
Console.WriteLine(result3); // 5
Operátor ?? je často čistější v řádku:
int? priority = null;
int effective = priority ?? 0; // 0 because priority is null
Console.WriteLine(effective); // 0
priority = 3;
effective = priority ?? 0; // 3 because priority has a value
Console.WriteLine(effective); // 3
Oba přístupy vrátí skutečnou hodnotu, pokud je k dispozici, a vámi určenou záložní možnost, pokud není.
Aritmetika s nulovatelnými typy hodnot
Aritmetické operátory a operátory porovnání pro typy hodnot s možnou hodnotou null se použijí: pokud je jeden z operandů null, výsledek je null spíše než chyba.
int? a = 10;
int? b = 20;
int? c = null;
int? sum = a + b; // both non-null: result is 30
int? product = a * c; // one operand is null: result is null
Console.WriteLine(sum); // 30
Console.WriteLine(product.HasValue); // False — null propagates through arithmetic
Hodnota Null se ve výchozím nastavení šíří prostřednictvím aritmetiky. Pokud chcete zabránit zřetězování hodnoty null, extrahujte hodnotu pomocí ?? nebo GetValueOrDefault před jejím použitím ve výpočtu.