Condividi tramite


Parola chiave Nothing (Visual Basic)

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

Annotazioni

Per i tipi valore non nullable, Nothing in Visual Basic differisce da null in C#. In Visual Basic, se si imposta una variabile di un tipo valore non nullable su Nothing, la variabile viene impostata sul valore predefinito per il tipo dichiarato. In C#, se si assegna una variabile di un tipo valore non nullable 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 Tipi valore e tipi di riferimento.

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

Se una variabile è di un tipo valore che non è nullable, assegnandola Nothing al 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 Nothing alla variabile lo imposta su un null riferimento del tipo della variabile. Una variabile impostata su un null riferimento non è associata ad alcun oggetto . Nell'esempio seguente viene illustrato quanto segue:

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 reference (o un tipo di valore nullable) è null, usare Is Nothing sempre o IsNot Nothing. Non utilizzare = Nothing o <> Nothing.

Per le stringhe in Visual Basic, la stringa vuota è uguale a Nothing. Pertanto, "" = Nothing è vero. 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 Is operatori 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 As clausola e la si imposta su Nothing, la variabile ha un tipo di Object. Un esempio di questo è 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 di , impostandola su Nothing non termina 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.

Vedere anche