Types valeur Nullable (Visual Basic)Nullable Value Types (Visual Basic)

Parfois, vous utilisez un type valeur qui n’a pas de valeur définie dans certaines circonstances.Sometimes you work with a value type that does not have a defined value in certain circumstances. Par exemple, un champ dans une base de données peut être obligé de faire la distinction entre avoir une valeur assignée explicite et ne pas avoir de valeur assignée.For example, a field in a database might have to distinguish between having an assigned value that is meaningful and not having an assigned value. Les types valeur peuvent être étendus pour prendre leurs valeurs normales ou une valeur null.Value types can be extended to take either their normal values or a null value. Une telle extension est appelée un type Nullable.Such an extension is called a nullable type.

Chaque type valeur Nullable est construit à partir de la Nullable<T> structure générique.Each nullable value type is constructed from the generic Nullable<T> structure. Prenons l’exemple d’une base de données qui effectue le suivi des activités liées au travail.Consider a database that tracks work-related activities. L’exemple suivant construit un type Nullable Boolean et déclare une variable de ce type.The following example constructs a nullable Boolean type and declares a variable of that type. Vous pouvez écrire la déclaration de trois manières :You can write the declaration in three ways:

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

La variable ridesBusToWork peut contenir une valeur True , une valeur False ou aucune valeur.The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Sa valeur par défaut initiale est aucune valeur, ce qui, dans ce cas, signifie que les informations n’ont pas encore été obtenues pour cette personne.Its initial default value is no value at all, which in this case could mean that the information has not yet been obtained for this person. En revanche, False cela peut signifier que les informations ont été obtenues et que la personne n’a pas la possibilité d’utiliser le bus pour fonctionner.In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

Vous pouvez déclarer des variables et des propriétés avec des types valeur Nullable, et vous pouvez déclarer un tableau avec des éléments d’un type valeur Nullable.You can declare variables and properties with nullable value types, and you can declare an array with elements of a nullable value type. Vous pouvez déclarer des procédures avec des types valeur Nullable comme paramètres, et vous pouvez retourner un type valeur Nullable à partir d’une Function procédure.You can declare procedures with nullable value types as parameters, and you can return a nullable value type from a Function procedure.

Vous ne pouvez pas construire un type Nullable sur un type référence, tel qu’un tableau, un String ou une classe.You cannot construct a nullable type on a reference type such as an array, a String, or a class. Le type sous-jacent doit être un type valeur.The underlying type must be a value type. Pour plus d'informations, consultez Value Types and Reference Types.For more information, see Value Types and Reference Types.

Utilisation d’une variable de type NullableUsing a Nullable Type Variable

Les membres les plus importants d’un type valeur Nullable sont HasValue ses Value Propriétés et.The most important members of a nullable value type are its HasValue and Value properties. Pour une variable d’un type valeur Nullable, HasValue indique si la variable contient une valeur définie.For a variable of a nullable value type, HasValue tells you whether the variable contains a defined value. Si HasValue est True , vous pouvez lire la valeur à partir de Value .If HasValue is True, you can read the value from Value. Notez que HasValue et Value sont des ReadOnly Propriétés.Note that both HasValue and Value are ReadOnly properties.

Valeurs par défautDefault Values

Quand vous déclarez une variable avec un type valeur Nullable, sa HasValue propriété a la valeur par défaut False .When you declare a variable with a nullable value type, its HasValue property has a default value of False. Cela signifie que, par défaut, la variable n’a pas de valeur définie, et non la valeur par défaut de son type de valeur sous-jacent.This means that by default the variable has no defined value, instead of the default value of its underlying value type. Dans l’exemple suivant, la variable n' numberOfChildren a initialement aucune valeur définie, même si la valeur par défaut du Integer type est 0.In the following example, the variable numberOfChildren initially has no defined value, even though the default value of the Integer type is 0.

Dim numberOfChildren? As Integer

Une valeur null est utile pour indiquer une valeur non définie ou inconnue.A null value is useful to indicate an undefined or unknown value. Si numberOfChildren a été déclaré comme Integer , aucune valeur ne peut indiquer que les informations ne sont pas disponibles actuellement.If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

Stocker des valeursStoring Values

Vous stockez une valeur dans une variable ou une propriété d’un type valeur Nullable de la façon habituelle.You store a value in a variable or property of a nullable value type in the typical way. L’exemple suivant affecte une valeur à la variable numberOfChildren déclarée dans l’exemple précédent.The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Si une variable ou une propriété d’un type valeur Nullable contient une valeur définie, vous pouvez la forcer à revenir à son état initial qui n’a pas de valeur assignée.If a variable or property of a nullable value type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. Pour ce faire, affectez à la variable ou à la propriété la valeur Nothing , comme le montre l’exemple suivant.You do this by setting the variable or property to Nothing, as the following example shows.

numberOfChildren = Nothing

Notes

Bien que vous puissiez assigner Nothing à une variable d’un type valeur Nullable, vous ne pouvez pas la tester à Nothing l’aide du signe égal.Although you can assign Nothing to a variable of a nullable value type, you cannot test it for Nothing by using the equal sign. La comparaison qui utilise le signe égal, someVar = Nothing , est toujours évaluée à Nothing .Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing. Vous pouvez tester la propriété de la variable HasValue pour False ou tester à l’aide de l' Is IsNot opérateur or.You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

Récupération de valeursRetrieving Values

Pour récupérer la valeur d’une variable d’un type valeur Nullable, vous devez d’abord tester sa HasValue propriété pour confirmer qu’elle a une valeur.To retrieve the value of a variable of a nullable value type, you should first test its HasValue property to confirm that it has a value. Si vous essayez de lire la valeur lorsque HasValue a la valeur False , Visual Basic lève une InvalidOperationException exception.If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception. L’exemple suivant illustre la méthode recommandée pour lire la variable numberOfChildren des exemples précédents.The following example shows the recommended way to read the variable numberOfChildren of the previous examples.

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

Comparaison des types NullableComparing Nullable Types

Lorsque Boolean des variables Nullable sont utilisées dans des expressions booléennes, le résultat peut être True , False ou Nothing .When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. Voici la table de vérité pour And et Or .The following is the truth table for And and Or. Étant donné que b1 et b2 ont maintenant trois valeurs possibles, il existe neuf combinaisons à évaluer.Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

B1b1 B2b2 B1 et B2b1 And b2 B1 ou B2b1 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

Quand la valeur d’une variable ou d’une expression booléenne est Nothing , elle n’est ni true ni false .When the value of a Boolean variable or expression is Nothing, it is neither true nor false. Considérez l'exemple suivant.Consider the following example.

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 .In this example, b1 And b2 evaluates to Nothing. Par conséquent, la Else clause est exécutée dans chaque If instruction, et la sortie est la suivante :As a result, the Else clause is executed in each If statement, and the output is as follows:

Expression is not true

Expression is not false

Notes

AndAlso et OrElse , qui utilisent l’évaluation de court-circuit, doivent évaluer leurs deux opérandes lorsque le premier est évalué à Nothing .AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

PropagationPropagation

Si l’un des opérandes d’une opération arithmétique, de comparaison, de décalage ou de type est un type valeur Nullable, le résultat de l’opération est également un type valeur Nullable.If one or both of the operands of an arithmetic, comparison, shift, or type operation is a nullable value type, the result of the operation is also a nullable value type. Si les deux opérandes ont des valeurs qui ne le sont pas Nothing , l’opération est effectuée sur les valeurs sous-jacentes des opérandes, comme si aucun n’était un type valeur Nullable.If both operands have values that are not Nothing, the operation is performed on the underlying values of the operands, as if neither were a nullable value type. Dans l’exemple suivant, les variables compare1 et sum1 sont implicitement typées.In the following example, variables compare1 and sum1 are implicitly typed. Si vous placez le pointeur de la souris dessus, vous verrez que le compilateur déduit les types valeur Nullable pour les deux.If you rest the mouse pointer over them, you will see that the compiler infers nullable value types for both of them.

' 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 des opérandes ou les deux ont Nothing la valeur, le résultat sera Nothing .If one or both operands have a value of Nothing, the result will be 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 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Utilisation de types Nullable avec des donnéesUsing Nullable Types with Data

Une base de données est l’un des emplacements les plus importants pour utiliser des types valeur Nullable.A database is one of the most important places to use nullable value types. Tous les objets de base de données ne prennent pas actuellement en charge les types valeur Nullable, contrairement aux adaptateurs de table générés par le concepteur.Not all database objects currently support nullable value types, but the designer-generated table adapters do. Consultez prise en charge de TableAdapter pour les types Nullable.See TableAdapter support for nullable types.

Voir aussiSee also