Partager via


Valeurs Null

Cette rubrique décrit l’utilisation de la valeur nulle en F#.

Valeur Null

Normalement, la valeur nulle n’est pas utilisée en F# pour les valeurs ou les variables. Toutefois, la valeur nulle apparaît sous forme de valeur anormale dans certaines situations. Si un type est défini en F#, la valeur nulle n’est pas autorisée en tant que valeur normale, sauf si l’attribut AllowNullLiteral est appliqué au type. Si un type est défini dans un autre langage .NET, la valeur nulle est une valeur possible. Quand vous interagissez avec ce genre de type, votre code F# peut rencontrer des valeurs nulles.

Pour un type défini en F# et utilisé strictement à partir du F#, le seul moyen de créer une valeur nulle en utilisant directement la bibliothèque F# consiste à employer Unchecked.defaultof ou Array.zeroCreate. Toutefois, pour un type F# utilisé à partir d’autres langages .NET, ou si vous utilisez ce type avec une API qui n’est pas écrite en F#, par exemple le .NET Framework, des valeurs nulles peuvent se produire.

Vous pouvez utiliser le type option en F# quand vous pouvez employer une variable de référence avec une éventuelle valeur nulle dans un autre langage .NET. À la place d’une valeur nulle, avec un type option F#, vous utilisez la valeur d’option None, s’il n’existe aucun objet. Vous utilisez la valeur d’option Some(obj) avec un objet obj quand il existe un objet. Pour plus d’informations, consultez Options . Notez que vous pouvez toujours inclure une valeur null dans un type Option si, pour Some x, x est null. C’est la raison pour laquelle il est important que vous utilisiez None quand une valeur est null.

Le mot clé null est un mot clé valide en F#. Vous devez l’employer quand vous utilisez des API du .NET Framework ou d’autres API écrites dans un autre langage .NET. Il existe deux situations où vous pouvez avoir besoin d’une valeur nulle : quand vous appelez une API .NET et que vous passez une valeur nulle en tant qu’argument, et quand vous interprétez la valeur de retour ou un paramètre de sortie d’un appel de méthode .NET.

Pour passer une valeur nulle à une méthode .NET, utilisez simplement le mot clé null dans le code appelant. L'exemple de code suivant illustre ceci.

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

Pour interpréter une valeur nulle obtenue à partir d’une méthode .NET, utilisez si possible des critères spéciaux. L’exemple de code suivant montre comment utiliser des critères spéciaux pour interpréter la valeur nulle retournée à partir de ReadLine quand elle tente de lire au-delà de la fin d’un flux d’entrée.

// 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
    ()

Il existe d’autres manières de générer des valeurs nulles pour les types F#, par exemple quand vous utilisez Array.zeroCreate, qui appelle Unchecked.defaultof. Vous devez utiliser ce code avec prudence pour garder les valeurs nulles encapsulées. Dans une bibliothèque destinée uniquement à F#, vous n’avez pas besoin de rechercher les valeurs nulles dans chaque fonction. Si vous écrivez une bibliothèque à des fins d’interopérabilité avec d’autres langages .NET, vous devrez peut-être ajouter des vérifications pour les paramètres d’entrée de valeur nulle, et lever une exception ArgumentNullException, comme vous le faites dans du code C# ou Visual Basic.

Vous pouvez utiliser le code suivant pour vérifier si une valeur arbitraire est nulle.

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

Voir aussi