Valeurs nulles
Cette rubrique décrit comment la valeur Null est utilisée dans F#.
Valeurs Null antérieures à F# 9
La valeur Null n’est normalement pas utilisée dans F# pour les valeurs ou les variables. Toutefois, la valeur Null apparaît comme une valeur anormale dans certaines situations. Si un type est défini en F#, null n’est pas autorisé 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 Null est une valeur possible et lorsque vous interagissez avec de tels types, votre code F# peut rencontrer des valeurs Null.
Pour un type défini en F# et utilisé strictement à partir de F#, la seule façon de créer une valeur Null à l’aide de la bibliothèque F# directement consiste à utiliser 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#, comme le .NET Framework, les valeurs Null peuvent se produire.
Vous pouvez utiliser le type option
en F# quand vous pouvez utiliser une variable de référence avec une valeur Null possible dans un autre langage .NET. Au lieu de null, avec un type F# option
, vous utilisez la valeur optionnelle None
s’il n’existe aucun objet. Vous utilisez la valeur d’option Some(obj)
avec un objet obj
lorsqu’il existe un objet. Pour plus d’informations, consultez Options. Notez que vous pouvez toujours ajouter une valeur null
dans une option si, pour Some x
, x
s'avère être null
. En raison de cela, il est important d’utiliser None
lorsqu’une valeur est null
.
Le mot clé null
est un mot clé valide en F#, et vous devez l’utiliser lorsque vous utilisez des API .NET Framework ou d’autres API écrites dans un autre langage .NET. Les deux situations dans lesquelles vous pouvez avoir besoin d’une valeur Null sont lorsque vous appelez une API .NET et passez une valeur Null en tant qu’argument, et lorsque vous interprétez la valeur de retour ou un paramètre de sortie à partir d’un appel de méthode .NET.
Pour passer une valeur Null à une méthode .NET, utilisez simplement le mot clé null
dans le code appelant. L’exemple de code suivant illustre cela.
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 Null obtenue à partir d’une méthode .NET, utilisez la correspondance de modèle si vous le pouvez. L’exemple de code suivant montre comment utiliser la correspondance de modèle pour interpréter la valeur Null retournée par ReadLine
lorsqu’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
()
Les valeurs Null pour les types F# peuvent également être générées de différentes manières, par exemple lorsque vous utilisez Array.zeroCreate
, qui appelle Unchecked.defaultof
. Vous devez être prudent avec ce code pour conserver les valeurs Null encapsulées. Dans une bibliothèque destinée uniquement à F#, vous n’avez pas besoin de vérifier les valeurs Null dans chaque fonction. Si vous écrivez une bibliothèque pour l’interopérabilité avec d’autres langages .NET, vous devrez peut-être ajouter des vérifications pour les paramètres d’entrée Null et lever un ArgumentNullException
, comme vous le faites dans le code C# ou Visual Basic.
Vous pouvez utiliser le code suivant pour vérifier si une valeur arbitraire est Null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."
Valeurs Nulles commençant par F# 9
Dans F# 9, des fonctionnalités supplémentaires sont ajoutées au langage pour traiter les types de référence qui peuvent avoir null
comme valeur. Celles-ci sont désactivées par défaut pour les activer, la propriété suivante doit être placée dans votre fichier projet :
<Nullable>enable</Nullable>
Cela transmet l’indicateur --checknulls+
au compilateur F# et définit une directive de préprocesseur NULLABLE
pour la build.
Pour activer explicitement la nullabilité, une déclaration de type doit être suffixée avec la nouvelle syntaxe :
type | null
Le symbole de barre |
a la signification d’un OR logique dans la syntaxe, créant une union de deux ensembles disjoints de types : le type sous-jacent et la référence nullable. Il s’agit du même symbole syntactique qui est utilisé pour déclarer plusieurs cas d’une union discriminée F# : type AB = A | B
porte la signification de A
, ou B
.
L’annotation nullable | null
peut être utilisée à tous les endroits où un type de référence serait normalement utilisé :
- Champs de types d'union, de types d'enregistrement et de types personnalisés.
- Alias de type pour les types existants.
- Types d’applications d’un type générique.
- Annotations de type explicites pour les let bindings, les paramètres ou les types de retour.
- Tapez des annotations pour des constructions de programmation d’objets telles que des membres, des propriétés ou des champs.
type AB = A | B
type AbNull = AB | null
type RecordField = { X: string | null }
type TupleField = string * string | null
type NestedGenerics = { Z : List<List<string | null> | null> | null }
Le symbole de barre |
a d’autres utilisations en F# qui peuvent entraîner des ambiguïtés syntactiques. Dans ce cas, les parenthèses sont nécessaires autour du type annoté Null :
// Unexpected symbol '|' (directly before 'null') in member definition
type DUField = N of string | null
Encapsuler le même type dans une paire de parenthèses ( )
résout le problème :
type DUField = N of (string | null)
Lorsqu’elle est utilisée dans la correspondance de modèles, |
est utilisée pour séparer différentes clauses de correspondance de modèle.
match x with
| ?: string | null -> ...
Cet extrait de code équivaut en fait au code effectuant d’abord un test de type sur le type string
, puis à avoir une clause distincte pour gérer null :
match x with
| ?: string
| null -> ...
Important
Les fonctionnalités supplémentaires associées à null ont été ajoutées au langage à des fins d’interopérabilité. L’utilisation de | null
dans la modélisation de type F# n’est pas considérée comme idiomatique pour indiquer les informations manquantes , à cet effet, utiliser des options (comme décrit ci-dessus). Apprenez-en plus sur les conventions relatives à null dans le guide de style.