Klíčové slovo Nothing (Visual Basic)

Představuje výchozí hodnotu libovolného datového typu. Výchozí hodnotou pro odkazové typy je null odkaz. U typů hodnot závisí výchozí hodnota na tom, jestli je typ hodnoty null.

Poznámka:

U nenulových hodnotových typů Nothing se v jazyce Visual Basic liší od null jazyka C#. Pokud v jazyce Visual Basic nastavíte proměnnou nenulového typu Nothinghodnoty na hodnotu , proměnná je nastavena na výchozí hodnotu pro jeho deklarovaný typ. Pokud v jazyce C# přiřadíte proměnnou nenulového typu hodnoty , dojde k nullchybě v době kompilace.

Poznámky

Nothing představuje výchozí hodnotu datového typu. Výchozí hodnota závisí na tom, zda je proměnná typu hodnoty nebo odkazového typu.

Proměnná typu hodnoty přímo obsahuje její hodnotu. Hodnotové typy zahrnují všechny číselné datové typy, , BooleanChar, Date, všechny struktury a všechny výčty. Proměnná typu odkazu ukládá odkaz na instanci objektu v paměti. Odkazové typy zahrnují třídy, pole, delegáty a řetězce. Další informace naleznete v tématu Typy hodnot a odkazové typy.

Pokud je proměnná typu hodnoty, chování Nothing závisí na tom, zda je proměnná datového typu s možnou hodnotou null. Chcete-li reprezentovat typ hodnoty null, přidejte ? do názvu typu modifikátor. Přiřazení Nothing proměnné s možnou hodnotou null nastaví hodnotu na null. Další informace a příklady naleznete v tématu Typy hodnot s možnou hodnotou Null.

Pokud je proměnná typu hodnoty, která není nullable, přiřaďte Nothing ji na výchozí hodnotu pro svůj deklarovaný typ. Pokud tento typ obsahuje členy proměnných, jsou všechny nastaveny na jejich výchozí hodnoty. Následující příklad to ilustruje pro skalární typy.

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

Pokud je proměnná typu odkazu, přiřazování Nothing proměnné ji nastaví na null odkaz typu proměnné. Proměnná nastavená na odkaz není přidružena k žádnému null objektu. Následující příklad ukazuje toto:

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

Chcete-li zkontrolovat, zda je nullproměnná odkazu (nebo typu hodnoty null) , vždy použijte Is Nothing nebo IsNot Nothing. Nepoužívejte = Nothing ani <> Nothing.

Pro řetězce v jazyce Visual Basic se prázdný řetězec rovná Nothing. "" = Nothing Proto platí. Díky této skutečnosti je obzvláště důležité, abyste při práci s řetězci zvolili správné porovnání. I když myString = Nothing a myString <> Nothing označuje, zda je nastavena neprázdná hodnota, důrazně doporučujeme použít String.IsNullOrEmpty(myString) pro tento účel. Použijte Is Nothing a IsNot Nothing určete, jestli byla nastavena nějaká hodnota, včetně prázdného řetězce.

Následující příklad ukazuje porovnání, která používají operátory Is a IsNot operátory:

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

Pokud deklarujete proměnnou bez použití As klauzule a nastavíte ji na Nothing, má proměnná typ Object. Příkladem je Dim something = Nothing. V tomto případě dojde k chybě kompilace, když Option Strict je zapnutá a Option Infer vypnutá.

Když přiřadíte Nothing proměnnou objektu, už odkazuje na žádnou instanci objektu. Pokud proměnná dříve odkazovala na instanci, nastavení nenakončí Nothing samotnou instanci. Instance je ukončena a paměť a systémové prostředky přidružené k ní jsou uvolněny až po zjištění uvolňování paměti (GC), že neexistují žádné aktivní odkazy.

Nothing se liší od objektu DBNull , který představuje neinicializovanou variantu nebo neexistující databázový sloupec.

Viz také