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 xxnull 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."

Siehe auch