Parola chiave Nothing (Visual Basic)

Rappresenta il valore predefinito di qualsiasi tipo di dati. Per i tipi di riferimento, il valore predefinito è il riferimento null. Per i tipi valore, il valore predefinito dipende dal fatto che il tipo di valore ammetta i valori Null.

Nota

Per i tipi valore che non ammettono i valori Null, Nothing in Visual Basic differisce da null in C#. In Visual Basic, se si imposta una variabile di un tipo valore che non ammette i valori Null su Nothing, la variabile viene impostata sul valore predefinito per il tipo dichiarato. In C#, se si assegna una variabile di un tipo valore che non ammette i valori Null a null, si verifica un errore in fase di compilazione.

Osservazioni:

Nothing rappresenta il valore predefinito di un tipo di dati. Il valore predefinito dipende dal fatto che la variabile sia di un tipo valore o di un tipo riferimento.

Una variabile di un tipo valore contiene direttamente il relativo valore. I tipi valore includono tutti i tipi di dati numerici, Boolean, Char, Date, tutte le strutture e tutte le enumerazioni. Una variabile di un tipo riferimento archivia un riferimento a un'istanza dell'oggetto in memoria. I tipi di riferimento includono classi, matrici, delegati e stringhe. Per altre informazioni, vedere Value Types and Reference Types.

Se una variabile è di un tipo valore, il comportamento di Nothing dipende dal fatto che la variabile sia di un tipo di dati che ammette i valori Null. Per rappresentare un tipo di valore che ammette i valori Null, aggiungere un modificatore ? al nome del tipo. L'assegnazione Nothing a una variabile che ammette i valori Null imposta il valore su null. Per altre informazioni, vedere Tipi valore che ammettono i valori Null.

Se una variabile è di un tipo valore che ammette i valori Null, assegnando Nothing a essa la si imposta sul valore predefinito per il tipo dichiarato. Se il tipo contiene membri di variabile, tutti sono impostati sui valori predefiniti. Nell'esempio seguente viene illustrato questo valore per i tipi scalari.

Module Module1

    Sub Main()
        Dim ts As TestStruct
        Dim i As Integer
        Dim b As Boolean

        ' The following statement sets ts.Name to null and ts.Number to 0.
        ts = Nothing

        ' The following statements set i to 0 and b to False.
        i = Nothing
        b = Nothing

        Console.WriteLine($"ts.Name: {ts.Name}")
        Console.WriteLine($"ts.Number: {ts.Number}")
        Console.WriteLine($"i: {i}")
        Console.WriteLine($"b: {b}")

        Console.ReadKey()
    End Sub

    Public Structure TestStruct
        Public Name As String
        Public Number As Integer
    End Structure
End Module

Se una variabile è di un tipo riferimento, l'assegnazione di Nothing alla variabile l imposta su un riferimento null del tipo della variabile. Una variabile impostata su un riferimento null non è associata ad alcun oggetto. Questo concetto è illustrato nell'esempio seguente:

Module Module1

    Sub Main()

        Dim testObject As Object
        ' The following statement sets testObject so that it does not refer to
        ' any instance.
        testObject = Nothing

        Dim tc As New TestClass
        tc = Nothing
        ' The fields of tc cannot be accessed. The following statement causes 
        ' a NullReferenceException at run time. (Compare to the assignment of
        ' Nothing to structure ts in the previous example.)
        'Console.WriteLine(tc.Field1)

    End Sub

    Class TestClass
        Public Field1 As Integer
        ' . . .
    End Class
End Module

Per verificare se una variabile di riferimento (o un tipo valore che ammette i valori Null) è null, usare sempre Is Nothing o IsNot Nothing. Non utilizzare = Nothing o <> Nothing.

Per le stringhe in Visual Basic, la stringa vuota è uguale a Nothing. Pertanto, "" = Nothing è true. Questo fatto rende particolarmente importante scegliere il confronto corretto quando si lavora con le stringhe. Sebbene myString = Nothing e myString <> Nothing indichino se è impostato un valore non vuoto, è consigliabile usare String.IsNullOrEmpty(myString) per questo scopo. Utilizzare Is Nothing e IsNot Nothing per determinare se è stato impostato un valore, inclusa una stringa vuota.

Nell'esempio seguente vengono illustrati i confronti che usano gli operatori Is e IsNot:

Module Module1
    Sub Main()

        Dim testObject As Object
        testObject = Nothing
        Console.WriteLine(testObject Is Nothing)
        ' Output: True

        Dim tc As New TestClass
        tc = Nothing
        Console.WriteLine(tc IsNot Nothing)
        ' Output: False

        ' Declare a nullable value type.
        Dim n? As Integer
        Console.WriteLine(n Is Nothing)
        ' Output: True

        n = 4
        Console.WriteLine(n Is Nothing)
        ' Output: False

        n = Nothing
        Console.WriteLine(n IsNot Nothing)
        ' Output: False

        Console.ReadKey()
    End Sub

    Class TestClass
        Public Field1 As Integer
        Private field2 As Boolean
    End Class
End Module

Se si dichiara una variabile senza usare una clausola As e la si imposta su Nothing, la variabile ha un tipo di Object. Un esempio di ciò è Dim something = Nothing. In questo caso si verifica un errore in fase di compilazione quando Option Strict è attivato e Option Infer è disattivato.

Quando si assegna Nothing a una variabile oggetto, non fa più riferimento a un'istanza dell'oggetto. Se la variabile aveva precedentemente fatto riferimento a un'istanza, impostandola su Nothing non si terminerà l'istanza stessa. L'istanza viene terminata e le risorse di sistema e di memoria associate vengono rilasciate solo dopo che il Garbage Collector rileva che non sono presenti riferimenti attivi rimanenti.

Nothing differisce dall'oggetto DBNull, che rappresenta una variante non inizializzata o una colonna di database inesistente.

Vedi anche