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 null
referência. Para tipos de valor, o valor padrão depende se o tipo de valor é anulável.
Nota
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 seu tipo declarado. Em C#, se você atribuir uma variável de um tipo de valor não anulável ao null
, ocorrerá um erro em tempo de compilação.
Observações
Nothing
representa o valor padrão de um 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. Os 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 é 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. A atribuição Nothing
a uma variável anulável define o valor como null
. Para obter mais informações e exemplos, consulte Nullable Value Types.
Se uma variável for de um tipo de valor que não é anulável, atribuindo-a 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 com seus valores padrão. O exemplo a seguir ilustra isso 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, a atribuição Nothing
à variável a define como uma null
referência do tipo da variável. Uma variável definida como uma null
referência não está associada a nenhum objeto. O exemplo a seguir demonstra isso:
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 utilize = Nothing
ou <> Nothing
.
Para cadeias de caracteres no Visual Basic, a cadeia de caracteres vazia é Nothing
igual a . Portanto, "" = Nothing
é verdade. Este fato torna especialmente importante que você escolha a comparação correta quando você trabalha com strings. Embora myString = Nothing
e myString <> Nothing
indique 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 Is
operadores 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 As
cláusula e defini-la como Nothing
, a variável terá um tipo de Object
. Um exemplo disso é Dim something = Nothing
. Neste caso, ocorre um erro em tempo de compilação 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 tiver se referido anteriormente a uma instância, defini-la como Nothing
não encerrará a instância em si. A instância é encerrada e a memória e os recursos do sistema associados a ela são liberados, somente depois que o coletor de lixo (GC) deteta que não há referências ativas restantes.
Nothing
difere do DBNull objeto, que representa uma variante não inicializada ou uma coluna de banco de dados inexistente.