Tipi di valori nullable (Visual Basic)
Talvolta si utilizzano tipi valore che in alcune circostanze sono privi di un valore definito. Ad esempio, in un campo di un database potrebbe essere necessario distinguere tra l'assegnazione di un valore significativo e la non assegnazione di un valore. È possibile estendere i tipi di valore per far sì che venga loro assegnato il valore normale o un valore null. Tale estensione viene denominata tipo nullable.
Ogni tipo nullable viene costruito a partire dalla struttura Nullable generica. Prendere in considerazione un database che tiene traccia delle attività relative al lavoro. Nell'esempio seguente viene creato un tipo Boolean nullable e viene dichiarata una variabile di quel tipo. È possibile scrivere la dichiarazione in tre modi:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
La variabile ridesBusToWork è in grado di contenere un valore di True, un valore di False o nessun valore. Il valore iniziale non è un valore, che in questo caso potrebbe significare che le informazioni non sono ancora state ottenute per questa persona. Il valore False, al contrario, potrebbe significare che si sono ottenute le informazioni e che la persona non prende l'autobus per andare a lavorare.
È possibile dichiarare variabili e proprietà con tipi nullable e dichiarare una matrice con elementi di tipo nullable. È possibile dichiarare procedure con tipi nullable come parametri e restituire un tipo nullable da una procedura Function.
Non è possibile creare un tipo nullable su un tipo di riferimento quale una matrice, una String o una classe. Il tipo sottostante deve essere un tipo di valore. Per ulteriori informazioni, vedere Tipi valore e tipi riferimento.
Utilizzo di una variabile di tipo nullable
I membri più importanti di un tipo nullable sono le sue proprietà HasValue e Value. Per una variabile di tipo nullable, HasValue indica se la variabile contiene un valore definito. Se HasValue è True, è possibile leggere il valore da Value. Si noti che HasValue e Value sono entrambe proprietà ReadOnly.
Valori predefiniti
Quando si dichiara una variabile con un tipo nullable, la sua proprietà HasValue dispone di un valore predefinito di False. Ciò significa che per impostazione predefinita la variabile non ha valore definito, anziché il valore predefinito del suo tipo di valore sottostante. Nell'esempio che segue, inizialmente la variabile numberOfChildren non ha valore definito, anche se il valore predefinito del tipo Integer corrisponde a 0.
Dim numberOfChildren? As Integer
Un valore null è utile per indicare un valore non definito o sconosciuto. Se numberOfChildren è stato dichiarato come Integer, non sarà presente alcun valore in grado di indicare che le informazioni non sono attualmente disponibili.
Memorizzazione di valori
La memorizzazione di un valore in una variabile o proprietà di un tipo nullable viene effettuata nel modo normale. Nell'esempio che segue viene illustrato come assegnare un valore alla variabile numberOfChildren dichiarata nell'esempio precedente.
numberOfChildren = 2
Se una variabile o proprietà di un tipo nullable contiene un valore definito, è possibile provocare il ripristino del suo stato iniziale (non assegnazione di un valore). Per far questo è necessario impostare la variabile o proprietà su Nothing, come illustrato nell'esempio seguente.
numberOfChildren = Nothing
Nota
Sebbene sia possibile assegnare Nothing a una variabile del tipo nullable, non è possibile eseguirne la verifica per Nothing utilizzando il segno di uguale.Un confronto che utilizza il segno di uguale, someVar = Nothing, restituisce sempre Nothing.È possibile testare la proprietà HasValue della variabile per False o testarla utilizzando l'operatore Is o IsNot.
Recupero di valori
Per recuperare il valore di una variabile di tipo nullable, è consigliabile verificarne prima la proprietà HasValue per confermare che sia dotata di un valore. Se si tenta di leggere il valore quando HasValue è False, in Visual Basic viene generata un'eccezione InvalidOperationException. Nell'esempio riportato di seguito viene illustrato il metodo consigliato per la lettura della variabile numberOfChildren degli esempi precedenti.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Confronto di tipi nullable
Quando vengono utilizzate variabili Boolean nullable nelle espressioni booleane, il risultato può essere True, False o Nothing. Di seguito è riportata la tabella della verità per And e Or. Poiché b1 e b2 hanno ora tre possibili valori, è necessario valutare nove combinazioni.
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 |
Quando il valore di una variabile o espressione booleana è Nothing, non è true né false. Prendere in considerazione l'esempio riportato di seguito.
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. Di conseguenza, la clausola Else viene eseguita in ogni istruzione If e l'output è il seguente:
Expression is not true
Expression is not false
Nota
AndAlso e OrElse, che utilizzano la valutazione short circuit devono valutare i secondi operandi quando i primi restituiscono Nothing.
Propagazione
Se uno o entrambi gli operandi di un'operazione aritmetica, di confronto, di spostamento o sui tipi sono nullable, anche il risultato dell'operazione è nullable. Se entrambi gli operandi hanno valori che non sono Nothing, l'operazione viene eseguita sui valori sottostanti degli operandi, come se non fossero di tipo nullable. Nell'esempio riportato di seguito le variabili compare1 e sum1 sono tipizzate in modo implicito. Se si posiziona il puntatore del mouse su di esse, si vedrà che il compilatore deduce tipi nullable per entrambe.
' 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.
' 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)
Utilizzo di tipi nullable con i dati
Uno dei posti più importanti in cui utilizzare i tipi nullable è un database. I tipi nullable non sono attualmente supportati da tutti gli oggetti di database, mentre lo sono dagli adattatori di tabella generati dalla finestra di progettazione. Vedere "Supporto dei TableAdapter per i tipi nullable" in Cenni preliminari sugli oggetti TableAdapter.
Vedere anche
Attività
Risoluzione dei problemi relativi ai tipi di dati (Visual Basic)
Riferimenti
Utilizzo dei tipi nullable (Guida per programmatori C#)
Operatore IsNot (Visual Basic)
Concetti
Tipi valore e tipi riferimento