Types valeur nullables

Mise à jour : novembre 2007

Vous utilisez parfois un type valeur dont la valeur n'est pas définie dans certains cas. Un champ de base de données doit parfois distinguer entre une valeur assignée explicite et l'absence de valeur assignée. Les types valeur peuvent être étendus pour accepter leurs valeurs normales ou une valeur null. Cette extension est appelée type nullable.

Chaque type nullable est construit à partir de la structure Nullable<T> générique. Prenons une base de données qui assure le suivi des activités professionnelles. L'exemple suivant construit un type Boolean nullable et déclare une variable de ce type. Vous pouvez écrire la déclaration de trois manières différentes:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

La variable ridesBusToWork peut contenir la valeur True, la valeur False ou aucune valeur. Sa valeur par défaut initiale n'est pas définie, ce qui signifie, dans ce cas, que les informations n'ont pas encore été obtenues pour cette personne. E revanche, False peut indiquer que les informations ont été obtenues et que la personne ne prend pas le bus pour aller au travail.

Vous pouvez déclarer des variables et des propriétés avec des types nullables, et vous pouvez déclarer un tableau avec des éléments d'un type nullable. Vous pouvez déclarer des procédures avec des types nullables comme paramètres, et vous pouvez retourner un type nullable à partir d'une procédure Function.

Vous ne pouvez pas construire un type nullable sur un type référence, par exemple un tableau, une String ou une classe. Le type sous-jacent doit être un type valeur. Pour plus d'informations, consultez Types valeur et types référence.

Utilisation d'une variable de type nullable

Les membres les plus importants d'un type nullable sont ses propriétés HasValue et Value. Pour une variable d'un type nullable, HasValue vous indique si la variable contient une valeur définie. Si HasValue a la valeur True, vous pouvez lire la valeur de Value. Notez que HasValue et Value sont des propriétés ReadOnly.

Valeurs par défaut

Lorsque vous déclarez une variable avec un type nullable, sa propriété HasValue a la valeur par défaut False. Cela signifie que par défaut, la variable n'a aucune valeur définie, au lieu de la valeur par défaut de son type valeur sous-jacent. Dans l'exemple suivant, la variable numberOfChildren n'a initialement aucune valeur définie, même si la valeur par défaut du type Integer est 0.

Dim numberOfChildren? As Integer

Une valeur null est utile pour indiquer une valeur non définie ou inconnue. Si numberOfChildren a été déclaré comme Integer, aucune valeur ne peut indiquer que les informations ne sont pas actuellement disponibles.

Stockage de valeurs

Vous stockez normalement une valeur dans une variable ou une propriété de type nullable. L'exemple suivant assigne une valeur à la variable numberOfChildren déclarée dans l'exemple précédent.

numberOfChildren = 2

Si une variable ou une propriété d'un type nullable contient une valeur définie, vous pouvez faire en sorte qu'elle rétablisse son état initial, c'est-à-dire sans valeur assignée. Pour ce faire, affectez Nothing à la variable ou la propriété, comme indiqué dans l'exemple suivant.

numberOfChildren = Nothing
Remarque :

Bien que vous puissiez assigner Nothing à une variable de type nullable, vous ne pouvez pas le tester pour Nothing en utilisant le signe égal. Une comparaison qui utilise le signe égal, someVar = Nothing, évalue toujours à Nothing. Vous pouvez tester la propriété HasValue de la variable pour False ou tester en utilisant l'opérateur Is ou IsNot.

Récupération de valeurs

Pour récupérer la valeur d'une variable d'un type nullable, vous devez d'abord tester sa propriété HasValue pour confirmer qu'une valeur lui est assignée. Si vous essayez de lire la valeur lorsque HasValue est False, Visual Basic lève une exception InvalidOperationException. L'exemple suivant décrit la méthode recommandée pour lire la variable numberOfChildren des exemples précédents.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Comparaison de types nullables

Lorsque des variables Boolean nullables sont utilisées dans des expressions booléennes, le résultat peut être True, False ou Nothing. Ce qui suit constitue la table de vérité pour And et Or. b1 et b2 ayant maintenant trois valeurs possibles, les combinaisons à évaluer sont au nombre de neuf.

b1

b2

b1 And b2

b1 Or b2

Nothing

Nothing

Nothing

Nothing

Nothing

True

Nothing

True

Nothing

False

False

Nothing

True

Nothing

Nothing

True

True

True

True

True

True

False

False

True

False

Nothing

False

Nothing

False

True

False

True

False

False

False

False

Lorsque la valeur d'une variable ou expression booléenne est Nothing, elle n'est ni true , ni false. Prenons l'exemple suivant.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

Dans cet exemple, b1 And b2 prend la valeur Nothing. En conséquence, la clause Else s'exécute dans chaque instruction If et le résultat est le suivant :

Expression is not true

Expression is not false

Remarque :

AndAlso et OrElse, qui utilisent l'évaluation de court-circuit doivent évaluer leurs seconds opérandes lorsque le premier prend la valeur Nothing.

Propagation

Si l'un ou les deux opérandes d'une opération arithmétique, de comparaison, de décalage ou de type est nullable, le résultat de l'opération est également nullable. Si les deux opérandes ont des valeurs différentes de Nothing, l'opération s'applique à des valeurs sous-jacentes des opérandes, comme si ni l'un ni l'autre n'étaient nullables. Dans l'exemple qui suit, les variables compare1 et sum1 sont typées implicitement. Si vous arrêtez le pointeur de la souris sur ces variables, vous voyez que le compilateur déduit des types nullables pour les deux variables.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3>2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine(m & " * " & n & " * " & sum1 & " * " & compare1)

Si l'un ou les deux opérandes ont une valeur de Nothing, le résultat est Nothing.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays 3 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

Utilisation de types nullables avec des données

Une base de données est l'un des emplacements les plus importants pour utiliser des types nullables. Tous les objets de base de données ne prennent pas en charge actuellement des types nullables, contrairement aux adaptateurs de table générés par le concepteur. Consultez « Prise en charge des types qui autorisent la valeur Null par le TableAdapter » dans Vue d'ensemble de TableAdapter.

Voir aussi

Tâches

Dépannage des types de données

Concepts

Types de données en Visual Basic

Types valeur et types référence

Vue d'ensemble de TableAdapter

Inférence de type local

Référence

InvalidOperationException

If, opérateur

Autres ressources

Implémentation des types de données