Wartości null
W tym temacie opisano sposób użycia wartości null w języku F#.
Wartość null
Wartość null nie jest zwykle używana w języku F# dla wartości lub zmiennych. Jednak wartość null jest wyświetlana jako nietypowa wartość w niektórych sytuacjach. Jeśli typ jest zdefiniowany w języku F#, wartość null nie jest dozwolona jako wartość regularna, chyba że atrybut AllowNullLiteral jest stosowany do typu. Jeśli typ jest zdefiniowany w innym języku .NET, wartość null jest możliwą wartością, a podczas współdziałania z takimi typami kod F# może napotkać wartości null.
W przypadku typu zdefiniowanego w języku F# i używanego ściśle z języka F#jedynym sposobem utworzenia wartości null przy użyciu biblioteki języka F# jest użycie polecenia Unchecked.defaultof lub Array.zeroCreate. Jednak w przypadku typu F# używanego z innych języków platformy .NET lub jeśli używasz tego typu z interfejsem API, który nie jest napisany w języku F#, na przykład w programie .NET Framework, mogą wystąpić wartości null.
Możesz użyć option
typu w języku F#, jeśli możesz użyć zmiennej referencyjnej z możliwą wartością null w innym języku .NET. Zamiast wartości null, w przypadku typu F# option
należy użyć wartości None
opcji, jeśli nie ma obiektu. Należy użyć wartości Some(obj)
opcji z obiektem obj
, gdy istnieje obiekt. Aby uzyskać więcej informacji, zobacz Opcje. Należy pamiętać, że nadal można spakować null
wartość do opcji, jeśli dla Some x
parametru x
ma wartość null
. W związku z tym ważne jest, aby używać None
wartości , gdy wartość to null
.
Słowo null
kluczowe jest prawidłowym słowem kluczowym w języku F#i należy go używać podczas pracy z interfejsami API programu .NET Framework lub innymi interfejsami API napisanymi w innym języku platformy .NET. Dwie sytuacje, w których może być potrzebna wartość null, to podczas wywoływania interfejsu API platformy .NET i przekazywania wartości null jako argumentu oraz interpretowania wartości zwracanej lub parametru wyjściowego z wywołania metody .NET.
Aby przekazać wartość null do metody .NET, wystarczy użyć null
słowa kluczowego w kodzie wywołującym. Pokazano to w poniższym przykładzie kodu.
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
Aby zinterpretować wartość null uzyskaną z metody .NET, użyj dopasowania wzorca, jeśli to możliwe. W poniższym przykładzie kodu pokazano, jak używać dopasowania wzorca w celu zinterpretowania wartości null zwracanej z ReadLine
momentu próby odczytania końca strumienia wejściowego.
// 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
()
Wartości null dla typów języka F# można również wygenerować na inne sposoby, na przykład w przypadku użycia Array.zeroCreate
metody , która wywołuje metodę Unchecked.defaultof
. Należy zachować hermetyzację wartości null przy użyciu takiego kodu. W bibliotece przeznaczonej tylko dla języka F#nie trzeba sprawdzać wartości null w każdej funkcji. Jeśli piszesz bibliotekę do współdziałania z innymi językami platformy .NET, może być konieczne dodanie sprawdzania parametrów wejściowych o wartości null i zgłoszenie ArgumentNullException
elementu , tak jak w kodzie C# lub Visual Basic.
Możesz użyć następującego kodu, aby sprawdzić, czy dowolna wartość ma wartość null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."