NULL-Werte (F#)
In diesem Thema wird die Verwendung des NULL-Werts in F# beschrieben.
NULL-Wert
Der NULL-Wert wird in F# normalerweise nicht für Werte oder Variablen verwendet. In bestimmten Situationen ist jedoch NULL als anormaler Wert vorhanden. Wenn ein Typ in F# definiert ist, ist NULL als regulärer Wert nicht erlaubt, außer wenn für den Typ das AllowNullLiteral-Attribut gilt. Wenn ein Typ in einer anderen .NET-Sprache definiert ist, ist NULL ein möglicher Wert, und bei der Interoperation mit diesen Typen muss F#-Code möglicherweise NULL-Werte behandeln.
Für einen in F# definierten und strikt in F# verwendeten Typ ist die einzige Möglichkeit zur Erstellung eines NULL-Werts mithilfe der F#-Bibliothek die direkte Verwendung von Unchecked.defaultof oder Array.zeroCreate. Für einen in anderen .NET-Sprachen verwendeten F#-Typ oder für einen in einer API verwendeten F#-Typ, die nicht in F# geschrieben wurde, z. B. einer .NET Framework-API, können NULL-Werte auftreten.
Mithilfe des option-Typs in F# können Sie eine Verweisvariable mit einem möglichen NULL-Wert in einer anderen .NET-Sprache verwenden. Mit dem F#-option-Typ verwenden Sie statt NULL den Optionswert None, wenn kein Objekt vorhanden ist. Sie verwenden den Optionswert Some(obj) mit dem Objekt obj, wenn ein Objekt vorhanden ist. Weitere Informationen finden Sie unter Optionen (F#).
Das null-Schlüsselwort ist ein gültiges Schlüsselwort in F#, und Sie müssen es verwenden, wenn Sie mit .NET Framework-APIs oder sonstigen APIs, die in einer anderer .NET-Sprache geschrieben sind, arbeiten. Es gibt zwei Situationen, in denen Sie eventuell einen NULL-Wert benötigen: wenn Sie eine .NET-API aufrufen und einen NULL-Wert als Argument übergeben, und wenn Sie den Rückgabewert oder einen Ausgabeparameters eines .NET-Methodenaufrufs interpretieren.
Verwenden Sie einfach im Aufrufcode das null-Schlüsselwort, um einen NULL-Wert an eine .NET-Methode zu übergeben. 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
Interpretieren Sie einen von einer .NET-Methode abgerufenen NULL-Wert nach Möglichkeit mithilfe von Mustervergleich. Im folgenden Codebeispiel wird gezeigt, wie mithilfe von Mustervergleich der NULL-Wert interpretiert wird, der von ReadLine zurückgegeben wird, wenn die Methode versucht, den Lesevorgang nach dem Ende eines Eingabestreams fortzusetzen.
// 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. durch die Verwendung von Array.zeroCreate, wodurch Unchecked.defaultof aufgerufen wird. Sie müssen bei solchem Code darauf achten, dass die NULL-Werte gekapselt bleiben. In einer nur für F# vorgesehenen Bibliothek müssen Sie nicht jede Funktion auf NULL-Werte überprüfen. Wenn Sie eine Bibliothek für die Interoperation mit anderen .NET-Sprachen schreiben, ist es möglicherweise erforderlich, wie in C#- oder Visual Basic-Code Überprüfungen auf NULL-Eingabeparameter hinzuzufügen und ArgumentNullException auszulösen.
Sie können folgenden Code zur Prüfung verwenden, wenn ein beliebiger Wert NULL ist.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."