NULL-Werte
In diesem Thema wird beschrieben, wie der NULL-Wert in F# verwendet wird.
Nullwert
Der NULL-Wert wird in F# normalerweise nicht für Werte oder Variablen verwendet. NULL wird jedoch unter bestimmten umständen als anormaler Wert angezeigt. Wenn ein Typ in F# definiert ist, ist NULL nur dann als regulärer Wert zulässig, wenn das AllowNullLiteral-Attribut auf den Typ angewendet wird. Wenn ein Typ in einer anderen .NET-Sprache definiert ist, ist NULL ein möglicher Wert, und wenn Sie mit solchen Typen interagieren, kann Ihr F#-Code mit NULL-Werten konfrontiert werden.
Für einen Typ, der in F# definiert ist und ausschließlich von F# aus verwendet wird, ist die einzige Möglichkeit, einen NULL-Wert direkt mit der F#-Bibliothek zu erstellen, die Verwendung von Unchecked.defaultof oder Array.zeroCreate. Bei einem F#-Typ, der von anderen .NET-Sprachen verwendet wird, oder wenn Sie diesen Typ mit einer API verwenden, die nicht in F# geschrieben ist (z. B. .NET Framework) können jedoch NULL-Werte auftreten.
Sie können den option
-Typ in F# verwenden, wenn Sie eine Verweisvariable mit einem möglichen NULL-Wert in einer anderen .NET-Sprache verwenden können. Anstelle von NULL verwenden Sie mit einem F#-option
-Typ den Optionswert None
, wenn kein Objekt vorhanden ist. Sie verwenden den Optionswert Some(obj)
mit einem obj
-Objekt, wenn ein Objekt vorhanden ist. Weitere Informationen finden Sie unter Optionen. Beachten Sie, dass Sie immer noch einen null
-Wert in eine Option packen können, wenn für Some x
x
null
ist. Aus diesem Grund ist es wichtig, dass Sie None
verwenden, wenn ein Wert null
ist.
Das Schlüsselwort null
ist ein gültiges Schlüsselwort in F#. Sie müssen es verwenden, wenn Sie mit .NET Framework-APIs oder anderen APIs arbeiten, die in einer anderen .NET-Sprache geschrieben sind. Die beiden Situationen, in denen Sie möglicherweise einen NULL-Wert benötigen, sind der Aufruf einer .NET-API und die Übergabe eines NULL-Werts als Argument sowie beim Interpretieren des Rückgabewerts oder eines Ausgabeparameters aus einem .NET-Methodenaufruf.
Um einen NULL-Wert an eine .NET-Methode zu übergeben, verwenden Sie einfach das Schlüsselwort null
im aufrufenden Code. Dies wird im folgenden Codebeispiel veranschaulicht.
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
Um einen NULL-Wert zu interpretieren, der von einer .NET-Methode abgerufen wird, verwenden Sie nach Möglichkeit Musterabgleich. Im folgenden Codebeispiel wird gezeigt, wie Sie Musterabgleich verwenden, um den NULL-Wert zu interpretieren, der von ReadLine
zurückgegeben wird, wenn versucht wird, über das Ende eines Eingabedatenstroms hinaus zu lesen.
// 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
()
NULL-Werte für F#-Typen können auch auf andere Weise generiert werden, z. B. wenn Sie Array.zeroCreate
verwenden, wodurch Unchecked.defaultof
aufgerufen wird. Sie müssen mit solchem Code vorsichtig sein, damit die NULL-Werte gekapselt bleiben. In einer Bibliothek, die nur für F# vorgesehen ist, müssen Sie nicht jede Funktion auf NULL-Werte überprüfen. Wenn Sie eine Bibliothek für Interoperabilität mit anderen .NET-Sprachen schreiben, müssen Sie möglicherweise Überprüfungen auf NULL-Eingabeparameter hinzufügen und eine ArgumentNullException
auslösen, genau wie in C#- oder Visual Basic-Code.
Sie können den folgenden Code verwenden, um zu überprüfen, ob ein beliebiger Wert NULL ist.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."