Hodnoty Null

Toto téma popisuje, jak se v jazyce F# používá hodnota null.

Hodnota null

Hodnota null se obvykle nepoužívá v jazyce F# pro hodnoty nebo proměnné. Hodnota null se však v určitých situacích zobrazuje jako neobvyklá hodnota. Pokud je typ definován v jazyce F#, hodnota null není povolena jako běžná hodnota, pokud není u typu použit atribut AllowNullLiteral . Pokud je typ definován v jiném jazyce .NET, hodnota null je možná hodnota a při spolupráci s těmito typy může kód F# narazit na hodnoty null.

V případě typu definovaného v jazyce F# a výhradně z jazyka F# je jediným způsobem, jak vytvořit hodnotu null pomocí knihovny jazyka F#, použít nezaškrtnuto.defaultof nebo Array.zeroCreate. Pro typ F#, který se používá z jiných jazyků .NET, nebo pokud používáte tento typ s rozhraním API, které není napsané v jazyce F#, například rozhraní .NET Framework, může dojít k hodnotám null.

Typ v jazyce F# můžete použít option , když můžete použít referenční proměnnou s možnou hodnotou null v jiném jazyce .NET. Místo hodnoty null s typem jazyka F# option použijete hodnotu None možnosti, pokud neexistuje žádný objekt. Hodnotu Some(obj) možnosti použijete s objektem obj , pokud je objekt. Další informace naleznete v tématu Možnosti. Všimněte si, že stále můžete zabalit null hodnotu do možnosti, pokud , pro Some x, x stane se null. Z tohoto důvodu je důležité použít None , pokud je nullhodnota .

Klíčové null slovo je platné klíčové slovo v jazyce F# a musíte ho použít při práci s rozhraními API rozhraní .NET Framework nebo jinými rozhraními API napsanými v jiném jazyce .NET. Dvě situace, kdy můžete potřebovat hodnotu null, jsou při volání rozhraní .NET API a předání hodnoty null jako argumentu a při interpretaci návratové hodnoty nebo výstupního parametru z volání metody .NET.

Pokud chcete metodě .NET předat hodnotu null, stačí použít null klíčové slovo ve volajícím kódu. Následující příklad kódu to dokládá.

open System

// Pass a null value to a .NET method.
let ParseDateTime (str: string) =
    let (success, res) =
        DateTime.TryParse(str, null, System.Globalization.DateTimeStyles.AssumeUniversal)

    if success then Some(res) else None

Chcete-li interpretovat hodnotu null získanou z metody .NET, použijte porovnávání vzorů, pokud je to možné. Následující příklad kódu ukazuje, jak pomocí porovnávání vzorů interpretovat hodnotu null vrácenou při ReadLine pokusu o čtení za konec vstupního streamu.

// Open a file and create a stream reader.
let fileStream1 =
    try
        System.IO.File.OpenRead("TextFile1.txt")
    with :? System.IO.FileNotFoundException ->
        printfn "Error: TextFile1.txt not found."
        exit (1)

let streamReader = new System.IO.StreamReader(fileStream1)

// ProcessNextLine returns false when there is no more input;
// it returns true when there is more input.
let ProcessNextLine nextLine =
    match nextLine with
    | null -> false
    | inputString ->
        match ParseDateTime inputString with
        | Some(date) -> printfn "%s" (date.ToLocalTime().ToString())
        | None -> printfn "Failed to parse the input."

        true

// A null value returned from .NET method ReadLine when there is
// no more input.
while ProcessNextLine(streamReader.ReadLine()) do
    ()

Hodnoty null pro typy jazyka F# lze také generovat jinými způsoby, například při použití Array.zeroCreate, která volá Unchecked.defaultof. U takového kódu musíte být opatrní, abyste zachovali zapouzdřené hodnoty null. V knihovně určené pouze pro jazyk F# nemusíte kontrolovat hodnoty null v každé funkci. Pokud píšete knihovnu pro spolupráci s jinými jazyky .NET, možná budete muset přidat kontroly vstupních parametrů s hodnotou null a vyvolat ArgumentNullExceptionvýjimku stejně jako v kódu jazyka C# nebo Visual Basic.

Pomocí následujícího kódu můžete zkontrolovat, jestli je libovolná hodnota null.

match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."

Viz také