TOC

This article has been localized into Czech by the community.

Datové typy:

Nulovatelné typy

NULL doslova znamená nic - proměnná, která ještě neobsahuje hodnotu. V tomto bodě tutoriálu jste se možná již setkali s proměnnými, které nebyly inicializovány, ať už úmyslně nebo ne - pokud ano, také víte, že musíte vždy zajistit, aby proměnná měla hodnotu, než se pokusíte tuto hodnotu přistupovat. Pokud ne, pravděpodobně vás čeká NullReferenceException.

NULL je zvláště relevantní, když pracujete se svými vlastními objekty a řetězci. Na druhou stranu, když pracujete s čísly, například s celým číslem, uvidíte, že vždy má (výchozí) hodnotu. Pro celé číslo je výchozí/nouzová hodnota 0 (nula), která nikdy není zaměňována s NULL - vůbec nejsou totéž, i když některé dynamicky typované programovací jazyky by je mohly považovat za stejné. 0 je číslo - NULL je nic.

Pokud se tedy někdy ocitnete v situaci, kdy chcete mít číslo, které reprezentuje nedefinovanou hodnotu/NULL, můžete se cítit uvězněni, protože nemůžete přiřadit null k proměnné celého čísla. Pokud ovšem toto celé číslo není definováno jako nulovatelná (nullable) - speciální jazyková konstrukce vytvořená pro situace právě jako je tato. Nulovatelnou proměnnou definujete připojením otazníku za typ. Zde je příklad ilustrující rozdíl:

int notNullable = null; // Will cause an error from the compiler

int? nullable = null; // Just fine - it's nullable!

To platí pro všechny takzvané hodnotové typy, jako jsou celá čísla, float, boolean a struktury. Řetězce a objekty na druhou stranu jsou referenční typy a nemohou být deklarovány jako nulovatelné, protože jsou nulovatelné už ve výchozím stavu.

Kontrola nulovatelné proměnné na hodnotu null

Takže nyní, když jste definovali proměnnou, která může být null, je samozřejmě důležité zkontrolovat, zda tomu tak opravdu je. Můžete to udělat dvěma způsoby: Porovnejte proměnnou s klíčovým slovem null, jako byste to dělali pro jakékoli jiné typy, nebo použijte vlastnost HasValue, kterou nulovatelný objekt zdědí ze struktury System.Nullable. Zde je příklad:

int? nullable = null;  
if (nullable == null)  
    Console.WriteLine("It's a null!");  
if (!nullable.HasValue)  
    Console.WriteLine("It's a null!");

Výsledek je stejný, takže použijte metodu, kterou považujete za nejčitelnější a nejsnadněji pochopitelnou. Vzhledem k tomu, že naše hodnota nyní může být null, měli byste ji vždy před použitím zkontrolovat - jinak byste mohli narazit na výjimku.

Použití hodnoty nulovatelné proměnné

Ze struktury System.Nullable také nulovatelný objekt zdědí vlastnost Value. Tato vlastnost může být použita k získání skutečné hodnoty nulovatelného objektu. Avšak pro jednoduché operace porovnávání, např. použití operátorů == a !=, vám C# umožňuje vynechat vlastnost Value a přímo porovnávat nulovatelný objekt. Jinými slovy, oba tyto příklady dosáhnou stejné věci:

int? nullable = 42;

if (nullable.Value == 42)  
    Console.WriteLine("It's 42!");  

if (nullable == 42)  
    Console.WriteLine("It's 42!");

Nulovatelné objekty vždy pocházejí z nějakého základního datového typu, např. z celého čísla, jak bylo ukázáno v předchozích příkladech. Zatímco tyto datové typy mohou mít výchozí hodnotu, výchozí hodnota nulovatelné proměnné je vždy null. Proto musíte před pokusem o použití hodnoty zkontrolovat null reference, jak bylo popsáno dříve. Nicméně, nulovatelný typ zdědí velmi pěknou pomocnou metodu, kterou můžete použít: GetValueOrDefault(). Vrátí hodnotu nulovatelného objektu, pokud není null, v takovém případě vrátí výchozí hodnotu základního typu. Takže pro nulovatelné celé číslo by bylo vráceno „0“, pro nulovatelný boolean by bylo vrácenofalse atd. To vám umožňuje zvládnout kontrolu i získání hodnoty v jediném příkazu:

if ((nullable.HasValue) && (nullable.Value == 42))
    Console.WriteLine("It's 42!");

if(nullable.GetValueOrDefault() == 42)
    Console.WriteLine("It's 42!");

Jak vidíte, poslední příklad je kratší a snadněji čitelný, přičemž dosahuje stejného výsledku.

Shrnutí

Hodnotové typy v C#, jako jsou celá čísla a booleany, mají vždy výchozí hodnotu. Pokud chcete obejít toto chování, například protože potřebujete rozlišovat mezi „0“ a null, nebo protože potřebujete vědět, zda uživatel aktivně vybral "false" pro něco, nebo jestli proměnná jen drží výchozí hodnotu false, pak můžete proměnnou udělat nulovatelnou připojením ? (otazníku) za typ.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!