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 null
hodnota .
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 ArgumentNullException
vý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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro