Tipi di valori nullable (Visual Basic)
A volte si lavora con un tipo valore che non ha un valore definito in determinate circostanze. Ad esempio, un campo in un database potrebbe dover distinguere tra avere un valore assegnato significativo e non avere un valore assegnato. I tipi valore possono essere estesi per accettare i valori normali o un valore Null. Tale estensione è detta tipo nullable.
Ogni tipo di valore nullable viene costruito dalla struttura generica Nullable<T> . Si consideri un database che tiene traccia delle attività correlate al lavoro. Nell'esempio seguente viene creato un tipo nullable Boolean
e viene dichiarata una variabile di tale 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
può contenere un valore , True
un valore di False
o nessun valore. Il valore predefinito iniziale non è affatto un valore, che in questo caso potrebbe significare che le informazioni non sono ancora state ottenute per questa persona. Al contrario, False
potrebbe significare che le informazioni sono state ottenute e la persona non guida l'autobus per lavorare.
È possibile dichiarare variabili e proprietà con tipi valore nullable ed è possibile dichiarare una matrice con elementi di un tipo valore nullable. È possibile dichiarare procedure con tipi valore nullable come parametri ed è possibile restituire un tipo valore nullable da una Function
routine.
Non è possibile costruire un tipo nullable in un tipo riferimento, ad esempio una matrice, un String
oggetto o una classe . Il tipo sottostante deve essere un tipo valore. Per altre informazioni, vedere Value Types and Reference Types.
Uso di una variabile di tipo nullable
I membri più importanti di un tipo valore nullable sono le relative HasValue proprietà e Value . Per una variabile di un tipo valore nullable, HasValue indica se la variabile contiene un valore definito. Se HasValue è True
, è possibile leggere il valore da Value. Si noti che sia che HasValueValue sono ReadOnly
proprietà.
Valori predefiniti
Quando si dichiara una variabile con un tipo valore nullable, la relativa HasValue proprietà ha un valore predefinito .False
Ciò significa che per impostazione predefinita la variabile non ha alcun valore definito, anziché il valore predefinito del tipo di valore sottostante. Nell'esempio seguente la variabile numberOfChildren
inizialmente non ha alcun valore definito, anche se il valore predefinito del Integer
tipo è 0.
Dim numberOfChildren? As Integer
Un valore Null è utile per indicare un valore non definito o sconosciuto. Se numberOfChildren
fosse stato dichiarato come Integer
, non sarebbe presente alcun valore che potrebbe indicare che le informazioni non sono attualmente disponibili.
Archiviazione dei valori
Si archivia un valore in una variabile o in una proprietà di un tipo valore nullable nel modo tipico. Nell'esempio seguente viene assegnato un valore alla variabile numberOfChildren
dichiarata nell'esempio precedente.
numberOfChildren = 2
Se una variabile o una proprietà di un tipo valore nullable contiene un valore definito, è possibile ripristinarne lo stato iniziale senza avere un valore assegnato. A tale scopo, impostare la variabile o la proprietà su Nothing
, come illustrato nell'esempio seguente.
numberOfChildren = Nothing
Nota
Sebbene sia possibile assegnare Nothing
a una variabile di un tipo valore nullable, non è possibile testarla Nothing
usando il segno di uguale. Il confronto che usa il segno di uguale, someVar = Nothing
, restituisce Nothing
sempre . È possibile testare la proprietà della HasValue variabile per False
o testare usando l'operatore Is
o IsNot
.
Recupero di valori
Per recuperare il valore di una variabile di un tipo valore nullable, è prima necessario testarne la HasValue proprietà per verificare che abbia un valore. Se si tenta di leggere il valore quando HasValue è False
, Visual Basic genera un'eccezione InvalidOperationException . Nell'esempio seguente viene illustrato il modo consigliato per leggere la 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 tra tipi nullable
Quando le variabili nullable Boolean
vengono usate nelle espressioni booleane, il risultato può essere True
, False
o Nothing
. Di seguito è riportata la tabella di verità per And
e Or
. Poiché b1
e b2
ora hanno tre valori possibili, sono disponibili nove combinazioni da valutare.
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 booleana o di un'espressione è Nothing
, non è né true
false
. Si consideri l'esempio seguente.
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 restituisce b1 And b2
Nothing
. Di conseguenza, la Else
clausola viene eseguita in ogni If
istruzione e l'output è il seguente:
Expression is not true
Expression is not false
Nota
AndAlso
e OrElse
, che usano la valutazione a corto circuito, devono valutare i secondi operandi quando il primo restituisce Nothing
.
Propagazione
Se uno o entrambi gli operandi di un'operazione aritmetica, di confronto, di spostamento o di tipo è un tipo valore nullable, il risultato dell'operazione è anche un tipo valore nullable. Se entrambi gli operandi hanno valori non Nothing
, l'operazione viene eseguita sui valori sottostanti degli operandi, come se nessuno fosse un tipo valore nullable. Nell'esempio seguente le variabili compare1
e sum1
vengono tipizzate in modo implicito. Se si posiziona il puntatore del mouse su di essi, si noterà che il compilatore deduce i tipi di valore nullable per entrambi.
' 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 pari Nothing
a , 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 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")
Uso di tipi nullable con dati
Un database è una delle posizioni più importanti per l'uso di tipi valore nullable. Non tutti gli oggetti di database supportano attualmente tipi valore nullable, ma gli adattatori di tabella generati dalla finestra di progettazione. Vedere Supporto di TableAdapter per i tipi nullable.
Vedi anche
Commenti e suggerimenti
Invia e visualizza il feedback per