Tipi di valori nullable (Visual Basic)Nullable Value Types (Visual Basic)

Talvolta si utilizza un tipo di valore che non dispone di un valore definito in determinate circostanze.Sometimes you work with a value type that does not have a defined value in certain circumstances. Ad esempio, un campo in un database potrebbe dover distinguere tra un valore assegnato significativo e senza un valore assegnato.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. I tipi di valore possono essere estesi in modo da usare i valori normali o un valore null.Value types can be extended to take either their normal values or a null value. Tale estensione viene chiamata tipo Nullable.Such an extension is called a nullable type.

Ogni tipo nullable viene costruito dalla struttura Nullable<T> generica.Each nullable type is constructed from the generic Nullable<T> structure. Si consideri un database che tiene traccia delle attività correlate al lavoro.Consider a database that tracks work-related activities. Nell'esempio seguente viene costruito un tipo Nullable Boolean e viene dichiarata una variabile di quel tipo.The following example constructs a nullable Boolean type and declares a variable of that type. È possibile scrivere la dichiarazione in tre modi:You can write the declaration in three ways:

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

La variabile ridesBusToWork può avere un valore di True, un valore di False o nessun valore.The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Il valore predefinito iniziale non è alcun valore, che in questo caso potrebbe indicare che le informazioni non sono state ancora ottenute per questa persona.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. Al contrario, False potrebbe significare che le informazioni sono state ottenute e che la persona non ha cavalcato il bus per lavorare.In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

È possibile dichiarare variabili e proprietà con tipi nullable ed è possibile dichiarare una matrice con elementi di un tipo Nullable.You can declare variables and properties with nullable types, and you can declare an array with elements of a nullable type. È possibile dichiarare procedure con tipi nullable come parametri ed è possibile restituire un tipo Nullable da una procedura Function.You can declare procedures with nullable types as parameters, and you can return a nullable type from a Function procedure.

Non è possibile costruire un tipo nullable in un tipo di riferimento, ad esempio una matrice, una String o una classe.You cannot construct a nullable type on a reference type such as an array, a String, or a class. Il tipo sottostante deve essere un tipo valore.The underlying type must be a value type. Per altre informazioni, vedere Value Types and Reference Types.For more information, see Value Types and Reference Types.

Uso di una variabile di tipo NullableUsing a Nullable Type Variable

I membri più importanti di un tipo nullable sono le proprietà HasValue e Value.The most important members of a nullable type are its HasValue and Value properties. Per una variabile di tipo nullable, HasValue indica se la variabile contiene un valore definito.For a variable of a nullable type, HasValue tells you whether the variable contains a defined value. Se HasValue è True, è possibile leggere il valore da Value.If HasValue is True, you can read the value from Value. Si noti che HasValue e Value sono proprietà ReadOnly.Note that both HasValue and Value are ReadOnly properties.

Valori predefinitiDefault Values

Quando si dichiara una variabile con un tipo nullable, la relativa proprietà HasValue ha il valore predefinito False.When you declare a variable with a nullable type, its HasValue property has a default value of False. Questo significa che per impostazione predefinita la variabile non ha un valore definito, anziché il valore predefinito del tipo di valore sottostante.This means that by default the variable has no defined value, instead of the default value of its underlying value type. Nell'esempio seguente, la variabile numberOfChildren inizialmente non ha alcun valore definito, anche se il valore predefinito del tipo Integer è 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

Un valore null è utile per indicare un valore non definito o sconosciuto.A null value is useful to indicate an undefined or unknown value. Se numberOfChildren è stata dichiarata come Integer, non esiste alcun valore che potrebbe indicare che le informazioni non sono attualmente disponibili.If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

Archiviazione di valoriStoring Values

Un valore in una variabile o in una proprietà di un tipo nullable viene archiviato in modo tipico.You store a value in a variable or property of a nullable type in the typical way. Nell'esempio seguente viene assegnato un valore alla variabile numberOfChildren dichiarata nell'esempio precedente.The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Se una variabile o una proprietà di un tipo Nullable contiene un valore definito, è possibile fare in modo che venga ripristinato lo stato iniziale della mancata assegnazione di un valore.If a variable or property of a nullable type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. A tale scopo, impostare la variabile o la proprietà su Nothing, come illustrato nell'esempio seguente.You do this by setting the variable or property to Nothing, as the following example shows.

numberOfChildren = Nothing

Nota

Sebbene sia possibile assegnare Nothing a una variabile di un tipo nullable, non è possibile testarla per Nothing usando il segno di uguale.Although you can assign Nothing to a variable of a nullable type, you cannot test it for Nothing by using the equal sign. Il confronto che usa il segno di uguale, someVar = Nothing, restituisce sempre Nothing.Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing. È possibile testare la proprietà HasValue della variabile per False o eseguire il test usando l'operatore Is o IsNot.You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

Recupero di valoriRetrieving Values

Per recuperare il valore di una variabile di un tipo nullable, è necessario prima testare la relativa proprietà HasValue per verificare che disponga di un valore.To retrieve the value of a variable of a nullable type, you should first test its HasValue property to confirm that it has a value. Se si tenta di leggere il valore quando HasValue è False, Visual Basic genera un'eccezione InvalidOperationException.If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception. Nell'esempio seguente viene illustrato il modo consigliato per leggere la variabile numberOfChildren degli esempi precedenti.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

Confronto tra tipi NullableComparing Nullable Types

Quando le variabili nullable Boolean vengono utilizzate nelle espressioni booleane, il risultato può essere True, False o Nothing.When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. Di seguito è riportata la tabella di verità per And e Or.The following is the truth table for And and Or. Poiché b1 e b2 hanno ora tre valori possibili, è necessario valutare nove combinazioni.Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

b1b1 b2b2 B1 e B2b1 And b2 B1 o 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

Quando il valore di una variabile o di un'espressione booleana è Nothing, non è né truefalse.When the value of a Boolean variable or expression is Nothing, it is neither true nor false. Si osservi l'esempio riportato di seguito.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

In questo esempio b1 And b2 restituisce Nothing.In this example, b1 And b2 evaluates to Nothing. Di conseguenza, la clausola Else viene eseguita in ogni istruzione If e l'output è il seguente: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

Nota

AndAlso e OrElse, che usano la valutazione del cortocircuito, devono valutare i secondi operandi quando il primo restituisce Nothing.AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

PropagazionePropagation

Se uno o entrambi gli operandi di un'operazione aritmetica, di confronto, di spostamento o di tipo ammettono valori null, anche il risultato dell'operazione è nullable.If one or both of the operands of an arithmetic, comparison, shift, or type operation is nullable, the result of the operation is also nullable. Se entrambi gli operandi hanno valori che non sono Nothing, l'operazione viene eseguita sui valori sottostanti degli operandi, come se nessuno dei due fosse un tipo 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 type. Nell'esempio seguente le variabili compare1 e sum1 sono tipizzate in modo implicito.In the following example, variables compare1 and sum1 are implicitly typed. Se si posiziona il puntatore del mouse su di essi, si noterà che il compilatore deduce i tipi Nullable per entrambi.If you rest the mouse pointer over them, you will see that the compiler infers nullable 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}")

Se uno o entrambi gli operandi hanno un valore Nothing, il risultato sarà 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>")}")

Utilizzo di tipi nullable con datiUsing Nullable Types with Data

Un database è uno dei punti più importanti per usare i tipi nullable.A database is one of the most important places to use nullable types. Non tutti gli oggetti di database supportano attualmente i tipi nullable, ma gli adattatori di tabella generati dalla finestra di progettazione.Not all database objects currently support nullable types, but the designer-generated table adapters do. Vedere supporto TableAdapter per i tipi nullable.See TableAdapter support for nullable types.

Vedere ancheSee also