Share via


Null-waarden

In dit onderwerp wordt beschreven hoe de null-waarde wordt gebruikt in F#.

Null-waarde

De null-waarde wordt normaal gesproken niet gebruikt in F# voor waarden of variabelen. Null wordt echter weergegeven als een abnormale waarde in bepaalde situaties. Als een type is gedefinieerd in F#, is null niet toegestaan als een reguliere waarde, tenzij het kenmerk AllowNullLiteral wordt toegepast op het type. Als een type is gedefinieerd in een andere .NET-taal, is null een mogelijke waarde en wanneer u met dergelijke typen werkt, kan uw F#-code null-waarden tegenkomen.

Voor een type dat in F# is gedefinieerd en strikt wordt gebruikt vanuit F#, is de enige manier om rechtstreeks een null-waarde te maken met de F#-bibliotheek, het gebruik van Unchecked.defaultof of Array.zeroCreate. Voor een F#-type dat wordt gebruikt vanuit andere .NET-talen of als u dat type gebruikt met een API die niet is geschreven in F#, zoals .NET Framework, kunnen null-waarden optreden.

U kunt het option type in F# gebruiken wanneer u mogelijk een verwijzingsvariabele gebruikt met een mogelijke null-waarde in een andere .NET-taal. In plaats van null, met een F# option -type, gebruikt u de optiewaarde None als er geen object is. U gebruikt de optiewaarde Some(obj) met een object obj wanneer er een object is. Zie Opties voor meer informatie. Houd er rekening mee dat u nog steeds een waarde in een null optie kunt inpakken als Some xdit x gebeurt null. Daarom is het belangrijk dat u gebruikt None wanneer een waarde is null.

Het null trefwoord is een geldig trefwoord in F# en u moet het gebruiken wanneer u werkt met .NET Framework-API's of andere API's die zijn geschreven in een andere .NET-taal. De twee situaties waarin u mogelijk een null-waarde nodig hebt, zijn wanneer u een .NET-API aanroept en een null-waarde als argument doorgeeft en wanneer u de retourwaarde of een uitvoerparameter uit een .NET-methodeaanroep interpreteert.

Als u een null-waarde wilt doorgeven aan een .NET-methode, gebruikt u het null trefwoord in de aanroepende code. In het volgende codevoorbeeld ziet u dit.

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

Als u een null-waarde wilt interpreteren die wordt verkregen uit een .NET-methode, gebruikt u desgewenst patroonkoppeling. In het volgende codevoorbeeld ziet u hoe u patroonkoppeling gebruikt om de null-waarde te interpreteren die wordt geretourneerd wanneer wordt geprobeerd ReadLine voorbij het einde van een invoerstroom te lezen.

// 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-waarden voor F#-typen kunnen ook op andere manieren worden gegenereerd, zoals wanneer u gebruikt Array.zeroCreate, welke aanroepen Unchecked.defaultof. U moet voorzichtig zijn met dergelijke code om de null-waarden ingekapseld te houden. In een bibliotheek die alleen is bedoeld voor F#, hoeft u niet te controleren op null-waarden in elke functie. Als u een bibliotheek schrijft voor interoperation met andere .NET-talen, moet u mogelijk controles voor null-invoerparameters toevoegen en een ArgumentNullException, net als in C# of Visual Basic-code, genereren.

U kunt de volgende code gebruiken om te controleren of een willekeurige waarde null is.

match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."

Zie ook