Palabra clave Nothing (Visual Basic)
Representa el valor predeterminado de cualquier tipo de datos. Para los tipos de referencia, el valor predeterminado es la referencia null
. Para los tipos de valor, el valor predeterminado depende de si el tipo de valor admite un valor NULL.
Nota
Para los tipos de valor que no aceptan valores NULL, Nothing
en Visual Basic difiere de null
en C#. En Visual Basic, si establece una variable de un tipo de valor que no acepta valores NULL en Nothing
, la variable se establece en el valor predeterminado para su tipo declarado. En C#, si asigna una variable de un tipo de valor que no acepta valores NULL en null
, se produce un error en tiempo de compilación.
Comentarios
Nothing
representa el valor predeterminado de un tipo de datos. El valor predeterminado depende de si la variable es de un tipo de valor o de un tipo de referencia.
Una variable de un tipo de valor contiene directamente su valor. Los tipos de valor incluyen todos los tipos de datos numéricos, Boolean
, Char
, Date
, todas las estructuras y todas las enumeraciones. Una variable de un tipo de referencia almacena una referencia a una instancia del objeto en memoria. Los tipos de referencia incluyen clases, matrices, delegados y cadenas. Para obtener más información, consulta Value Types and Reference Types.
Si una variable es de un tipo de valor, el comportamiento de Nothing
depende de si la variable es de un tipo de datos que admite un valor NULL. Para representar un tipo de valor que admite un valor NULL, agregue un modificador ?
al nombre de tipo. La asignación de Nothing
a una variable que admite un valor NULL establece el valor en null
. Para más información y ejemplos, consulte Tipos de valores que admiten un valor NULL.
Si una variable es de un tipo de valor que no acepta valores NULL, asignarle Nothing
la establece en el valor predeterminado para su tipo declarado. Si ese tipo contiene miembros de variable, todos se establecen en sus valores predeterminados. En el ejemplo siguiente, esto se ilustra 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
Si una variable es de un tipo de referencia, la asignación de Nothing
a la variable la establece en una referencia null
del tipo de la variable. Una variable que se establece en una referencia null
no está asociada con ningún objeto. En el siguiente ejemplo se muestra esto:
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 comprobar si una variable de referencia (o tipo de valor que admite un valor NULL) es null
, use siempre Is Nothing
o IsNot Nothing
. No use = Nothing
o <> Nothing
.
Para las cadenas de Visual Basic, la cadena vacía equivale a Nothing
. Por lo tanto, "" = Nothing
se cumple. Este hecho hace que sea especialmente importante que elija la comparación correcta al trabajar con cadenas. Aunque myString = Nothing
y myString <> Nothing
indican si se establece un valor no vacío, se recomienda usar String.IsNullOrEmpty(myString)
para este fin. Use Is Nothing
y IsNot Nothing
para determinar si se estableció algún valor, incluida una cadena vacía.
En el ejemplo siguiente, se muestran comparaciones que utilizan los operadores Is
y 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 declara una variable sin usar una cláusula As
y la establece en Nothing
, la variable tiene un tipo de Object
. Un ejemplo sería Dim something = Nothing
. Se produce un error en tiempo de compilación en este caso cuando Option Strict
está activada y Option Infer
, desactivada.
Cuando asigna Nothing
a una variable de objeto, ya no hace referencia a ninguna instancia de objeto. Si anteriormente la variable hacía referencia a una instancia, establecerla en Nothing
no finaliza la instancia misma. La instancia finaliza y se liberan los recursos de memoria y sistema asociados a ella solo después de que el recolector de elementos no utilizados (GC) detectan que no quedan referencias activas.
Nothing
difiere del objeto DBNull, que representa una variante no inicializada o una columna de base de datos no existente.