Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
A volte si lavora con un tipo di 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 è chiamata tipo annullabile.
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 di 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 su un tipo riferimento, ad esempio una matrice, un Stringoggetto o una classe . Il tipo sottostante deve essere un tipo valore. Per altre informazioni, vedere Tipi valore e tipi di riferimento.
Uso di una variabile di tipo nullable
I membri più importanti di un tipo valore nullable sono le proprietà HasValue e Value relative. 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 HasValue che Value 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 un valore proprio definito, ma piuttosto assume il valore predefinito del suo 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 esisterebbe alcun valore che potrebbe indicare che le informazioni non sono attualmente disponibili.
Archiviazione dei valori
Si archivia un valore in una variabile o 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 di non avere un valore assegnato. A tale scopo, impostare la variabile o la proprietà su Nothing, come illustrato nell'esempio seguente.
numberOfChildren = Nothing
Annotazioni
Sebbene sia possibile assegnare Nothing a una variabile di tipo valore nullable, non è possibile verificarne la condizione Nothing usando il segno di uguale. Un confronto che utilizza il segno di uguale, someVar = Nothing, valuta sempre Nothing. È possibile testare la proprietà della HasValue variabile per Falseo testare usando l'operatore Is o IsNot .
Recupero di valori
Per recuperare il valore di una variabile di un tipo valore nullable, è necessario prima 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, Falseo 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 E b2 | b1 o 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 né 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, il valore b1 And b2 viene valutato come 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
Annotazioni
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 dei due 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 , Nothingil 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>")}")
Utilizzare i tipi nullable con i dati
Un database è uno dei luoghi più importanti per l'uso di tipi di valori nullabili. Non tutti gli oggetti di database supportano attualmente tipi di valore nullabile, ma gli adattatori di tabella generati dal progettista lo fanno. Vedere Supporto di TableAdapter per i tipi nullable.