Compartir a través de


Palabra clave Nothing (Visual Basic)

Representa el valor predeterminado de cualquier tipo de datos. Para los tipos de referencia, el valor predeterminado es la null referencia. Para los tipos de valor, el valor predeterminado depende de si el tipo de valor admite valores NULL.

Nota:

En el caso de 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 Nothingde valor que no acepta valores NULL en , 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 a null, se produce un error en tiempo de compilación.

Observaciones

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, Datetodas 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, vea Tipos de valor y tipos de referencia.

Si una variable es de un tipo de valor, el comportamiento de depende de Nothing si la variable es de un tipo de datos que acepta valores NULL. Para representar un tipo de valor que acepta valores NULL, agregue un ? modificador al nombre de tipo. Nothing La asignación a una variable que acepta valores NULL establece el valor en null. Para obtener más información y ejemplos, vea Tipos de valor que aceptan valores NULL.

Si una variable es de un tipo de valor que no acepta valores NULL, asignarlo Nothing a él lo 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 se muestra esto para los 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 Nothing a la variable la establece en una null referencia del tipo de la variable. Una variable que se establece en una null referencia no está asociada a ningún objeto. En el ejemplo siguiente se muestra lo siguiente:

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 acepta valores NULL) es null, use Is Nothing siempre o IsNot Nothing. No utilices = Nothing o <> Nothing.

En el caso de las cadenas de Visual Basic, la cadena vacía es igual a Nothing. Por lo tanto, "" = Nothing es cierto. Este hecho hace que sea especialmente importante que elija la comparación correcta al trabajar con cadenas. Aunque myString = Nothing e myString <> Nothing indique si se establece un valor no vacío, se recomienda encarecidamente usar String.IsNullOrEmpty(myString) para este propósito. 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 usan los Is operadores 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 As cláusula y la Nothingestablece en , la variable tiene un tipo de Object. Un ejemplo de esto es Dim something = Nothing. Un error en tiempo de compilación se produce en este caso cuando Option Strict está activado y Option Infer está desactivado.

Cuando se asigna Nothing a una variable de objeto, ya no hace referencia a ninguna instancia de objeto. Si la variable había hecho referencia anteriormente a una instancia, al establecerla Nothing en no finaliza la propia instancia. La instancia finaliza y los recursos del sistema y memoria asociados a ella se liberan, solo después de que el recolector de elementos no utilizados (GC) detecte que no quedan referencias activas.

Nothing difiere del DBNull objeto , que representa una variante sin inicializar o una columna de base de datos inexistente.

Consulte también