Mot clé Nothing (Visual Basic)

Représente la valeur par défaut d’un type de données quelconque. Pour les types référence, la valeur par défaut est la référence null. Pour les types valeur, la valeur par défaut varie selon que le type de valeur est null ou non.

Notes

Pour les types de valeurs non-nullables, Nothing en Visual Basic diffère de null en C#. En Visual Basic, si vous définissez une variable d’un type de valeur non-nullable sur Nothing, la variable est définie sur la valeur par défaut pour son type déclaré. En C#, si vous affectez une variable d’un type valeur non-nullable à null, une erreur de compilation se produit.

Notes

Nothing représente la valeur par défaut d’un type de données. La valeur par défaut varie selon que la variable est d’un type valeur ou d’un type référence.

Une variable d’un type valeur contient directement sa valeur. Les types valeur incluent tous les types de données numériques, Boolean, Char, Date, toutes les structures et toutes les énumérations. Une variable d’un type référence stocke une référence à une instance de l’objet en mémoire. Les types référence incluent des classes, des tableaux, des délégués et des chaînes. Pour plus d'informations, consultez Value Types and Reference Types.

Si une variable est d’un type valeur, le comportement de Nothing dépend de si la variable est d’un type de données pouvant accepter la valeur Null. Pour représenter un type valeur pouvant accepter la valeur Null, ajoutez un modificateur ? au nom de type. L’affectation de Nothing à une variable pouvant accepter la valeur Null définit la valeur sur null. Pour plus d’informations et d’exemples, consultez Types de valeurs pouvant accepter la valeur Null.

Si une variable est d’un type valeur qui n’accepte pas la valeur Null, lui affecter Nothing la définit sur la valeur par défaut pour son type déclaré. Si ce type contient des membres variables, ils sont tous définis sur leurs valeurs par défaut. L’exemple suivant illustre cela pour les types scalaires.

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

Si une variable est d’un type référence, affecter Nothing à la variable la définit sur une référence null du type de la variable. Une variable définie sur une référence null n’est associée à aucun objet. Cela est illustré par l'exemple suivant :

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

Lorsque vous vérifiez si une variable de référence (ou de type valeur pouvant accepter la valeur Null) est null, utilisez toujours Is Nothing ou IsNot Nothing. N'utilisez pas = Nothing ou <> Nothing.

Pour les chaînes en Visual Basic, la chaîne vide est égale à Nothing. Par conséquent, "" = Nothing est vrai. Cela rend particulièrement important le fait que vous choisissiez la comparaison correcte lorsque vous travaillez avec des chaînes. Bien que myString = Nothing et myString <> Nothing indiquent si une valeur non vide est définie, nous vous recommandons vivement d’utiliser String.IsNullOrEmpty(myString) à cette fin. Utilisez Is Nothing et IsNot Nothing pour déterminer si une valeur, y compris une chaîne vide, a été définie.

L’exemple suivant montre des comparaisons qui utilisent les opérateurs Is et 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

Si vous déclarez une variable sans utiliser de clause As et que vous la définissez sur Nothing, la variable a un type de Object. Dim something = Nothing en est un exemple. Une erreur de compilation se produit dans ce cas lorsque Option Strict est activé et Option Infer désactivé.

Lorsque vous attribuez Nothing à une variable objet, elle ne fait plus référence à une instance d’objet. Si la variable avait précédemment fait référence à un instance, sa définition sur Nothing n’arrête pas l’instance elle-même. La instance est terminée, et la mémoire et les ressources système qui lui sont associées sont libérées, uniquement après que le récupérateur de mémoire (GC) a détecté qu’il ne reste plus de références actives.

Nothing diffère de l’objet DBNull, qui représente une variante non initialisée ou une colonne de base de données inexistante.

Voir aussi