Condividi tramite


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#)

InvalidOperationException

Operatore If (Visual Basic)

Operatore Is (Visual Basic)

Operatore IsNot (Visual Basic)

HasValue

Concetti

Tipi di dati in Visual Basic

Tipi valore e tipi riferimento

Cenni preliminari sugli oggetti TableAdapter

Inferenza del tipo di variabile locale (Visual Basic)