Compartilhar via


Palavra-chave Nothing (Visual Basic)

Representa o valor padrão de qualquer tipo de dados. Para tipos de referência, o valor padrão é a referência null. Para tipos de valor, o valor padrão depende se o tipo de valor é anulável.

Observação

Para tipos de valor não anuláveis, Nothing no Visual Basic difere de null em C#. No Visual Basic, se você definir uma variável de um tipo de valor não anulável como Nothing, a variável será definida como o valor padrão para o tipo declarado. Em C#, se você atribuir uma variável de um tipo de valor não anulável a null, ocorrerá um erro em tempo de compilação.

Comentários

Nothing representa o valor padrão de qualquer tipo de dados. O valor padrão depende se a variável é de um tipo de valor ou de um tipo de referência.

Uma variável de um tipo de valor contém diretamente seu valor. Os tipos de valor incluem todos os tipos de dados numéricos, Boolean, Char, Date, todas as estruturas e todas as enumerações. Uma variável de um tipo de referência armazena uma referência a uma instância do objeto na memória. Tipos de referência incluem classes, matrizes, delegados e cadeias de caracteres. Para obter mais informações, consulte Tipos de Valor e Tipos de Referência.

Se uma variável for de um tipo de valor, o comportamento de Nothing depende se a variável é de um tipo de dados anulável. Para representar um tipo de valor anulável, adicione um modificador ? ao nome do tipo. Atribuir Nothing a uma variável anulável define o valor como null. Para obter mais informações e exemplos, consulte Tipos de valor anuláveis.

Se uma variável for de um tipo de valor não anulável, atribuir Nothing a ela a definirá como o valor padrão para seu tipo declarado. Se esse tipo contiver membros variáveis, todos eles serão definidos como seus valores padrão. O exemplo a seguir ilustra esse recurso para tipos escalares.

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 uma variável for de um tipo de referência, atribuir Nothing à variável a definirá como uma referência null do tipo da variável. Uma variável definida como uma referência null não está associada a nenhum objeto. O exemplo a seguir demonstra este:

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

Para verificar se uma variável de referência (ou tipo de valor anulável) é null, sempre use Is Nothing ou IsNot Nothing. Não use = Nothing ou <> Nothing.

Para cadeias de caracteres no Visual Basic, a cadeia de caracteres vazia é igual a Nothing. Portanto, "" = Nothing é verdadeiro. Esse fato torna especialmente importante que você escolha a comparação correta ao trabalhar com cadeias de caracteres. Embora myString = Nothing e myString <> Nothing indiquem se um valor não vazio está definido, é altamente recomendável usar String.IsNullOrEmpty(myString) para essa finalidade. Use Is Nothing e IsNot Nothing para determinar se algum valor, incluindo uma cadeia de caracteres vazia, foi definido.

O exemplo a seguir mostra comparações que usam os operadores 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 você declarar uma variável sem usar uma cláusula As e defini-la como Nothing, a variável terá um tipo de Object. Um exemplo disso é o Dim something = Nothing. Um erro em tempo de compilação ocorre nesse caso quando Option Strict está ativado e Option Infer, desativado.

Quando você atribui Nothing a uma variável de objeto, ela não se refere mais a nenhuma instância de objeto. Se a variável já tiver se referido a uma instância, defini-la como Nothingnão encerra a instância em si. A instância é encerrada e os recursos de memória e sistema associados a ela são liberados somente depois que o coletor de lixo (GC) detectar que não há referências ativas restantes.

Nothing difere do objeto DBNull, que representa uma variante não inicializada ou uma coluna de banco de dados inexistente.

Confira também