Types valeur Nullable (Visual Basic)
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 Implémentation des types de données (Visual Basic).
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
Notes
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 a la valeur 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 Nullable
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
Notes
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 Nullable. 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 Nullable 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 Nullable avec des données
Une base de données est l'un des emplacements les plus importants pour utiliser des types Nullable. Tous les objets de base de données ne prennent pas en charge actuellement les types Nullable, contrairement aux adaptateurs de table générés par le concepteur. Consultez « Prise en charge des types Nullable par le TableAdapter » dans Vue d'ensemble de TableAdapter.
Voir aussi
Tâches
Dépannage des types de données (Visual Basic)
Référence
Opérateur IsNot (Visual Basic)
Concepts
Types de données en Visual Basic
Vue d'ensemble de TableAdapter
Inférence de type local (Visual Basic)