Tipos que admiten valores null (Visual Basic)

A veces se trabaja con un tipo de valor que no tiene un valor definido en determinadas circunstancias. Por ejemplo, un campo de una base de datos podría tener que distinguir entre tener un valor asignado significativo y no tener un valor asignado. Los tipos de valor se pueden extender para tomar sus valores normales o un valor NULL. Esta extensión se conoce como tipo que acepta valores NULL.

Cada tipo de valor que acepta valores NULL se construye a partir de la estructura genérica Nullable<T>. Imagine una base de datos que realiza un seguimiento de las actividades relacionadas con el trabajo. En el ejemplo siguiente se crea un tipo Boolean que acepta valores NULL y se declara una variable de ese tipo. Puede escribir la declaración de tres maneras:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

La variable ridesBusToWork puede contener un valor de True, un valor de Falseo ningún valor en absoluto. Su valor predeterminado inicial es ningún valor en absoluto, lo que en este caso podría significar que la información de esta persona aún no se ha obtenido. En cambio, False podría significar que la información se ha obtenido y la persona no va en autobús al trabajo.

Puede declarar variables y propiedades con tipos de valor que aceptan valores NULL, y puede declarar una matriz con elementos de un tipo de valor que acepta valores NULL. Puede declarar procedimientos con tipos de valor que aceptan valores NULL como parámetros, y puede devolver un tipo de valor que acepta valores NULL desde un procedimiento Function.

No se puede construir un tipo que acepta valores NULL en un tipo de referencia como una matriz, String o una clase. El tipo subyacente debe ser un tipo de valor. Para obtener más información, consulta Value Types and Reference Types.

Uso de una variable de tipo que acepta valores NULL

Los miembros más importantes de un tipo de valor que acepta valores NULL son sus propiedades HasValue y Value. En una variable de un tipo de valor que acepta valores NULL, HasValue indica si la variable contiene un valor definido. Si HasValue es True, puede leer el valor desde Value. Tenga en cuenta que tanto HasValue como Value son propiedades ReadOnly.

Valores predeterminados

Cuando se declara una variable con un tipo de valor que acepta valores NULL, su propiedad HasValue tiene un valor predeterminado de False. Esto significa que, de manera predeterminada, la variable no tiene ningún valor definido en lugar del valor predeterminado de su tipo de valor subyacente. En el ejemplo siguiente, la variable numberOfChildren inicialmente no tiene ningún valor definido, aunque el valor predeterminado del tipo Integer sea 0.

Dim numberOfChildren? As Integer

Un valor NULL es útil para indicar un valor no definido o desconocido. Si numberOfChildren se hubiera declarado como Integer, no habría ningún valor que pudiera indicar que la información no está disponible actualmente.

Almacenamiento de valores

Un valor se almacena en una variable o propiedad de un tipo de valor que acepta valores NULL de la manera típica. En el ejemplo siguiente se asigna un valor a la variable numberOfChildren declarada en el ejemplo anterior.

numberOfChildren = 2

Si una variable o propiedad de un tipo de valor que acepta valores NULL contiene un valor definido, puede hacer que se revierta a su estado inicial de no tener ningún valor asignado. Para ello, establezca la variable o propiedad en Nothing, como se muestra en el ejemplo siguiente.

numberOfChildren = Nothing

Nota

Aunque puede asignar Nothing a una variable de un tipo de valor que acepta valores NULL, no puede probar Nothing con el signo igual. Una comparación que usa el signo igual, someVar = Nothing, siempre se evalúa como Nothing. Puede probar si la propiedad HasValue de la variable es False, o probar mediante el operador Is o IsNot.

Recuperación de valores

Para recuperar el valor de una variable de un tipo de valor que acepta valores NULL, primero debe probar su propiedad HasValue para confirmar que tiene un valor. Si intenta leer el valor cuando HasValue es False, Visual Basic inicia una excepción InvalidOperationException. En el ejemplo siguiente se muestra la manera recomendada de leer la variable numberOfChildren de los ejemplos anteriores.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Comparación de tipos que aceptan valores NULL

Cuando se usan variables Boolean que aceptan valores NULL en expresiones booleanas, el resultado puede ser True, False o Nothing. A continuación se muestra la tabla de la verdad de And y Or. Dado que b1 y b2 ahora tienen tres valores posibles, hay nueve combinaciones que evaluar.

b1 b2 b1 And b2 b1 Or b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

Si el valor de una variable o expresión booleana es Nothing, no es ni true ni false. Considere el ejemplo siguiente.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

En este ejemplo, b1 And b2 se evalúa como Nothing. Como resultado, la cláusula Else se ejecuta en cada instrucción If y la salida es la siguiente:

Expression is not true

Expression is not false

Nota

AndAlso y OrElse, que usan la evaluación de cortocircuito, deben evaluar sus segundos operandos si el primero se evalúa como Nothing.

Propagación

Si uno o ambos operandos de una operación aritmética, de comparación, de desplazamiento o de tipo es un tipo de valor que acepta valores NULL, el resultado de la operación también es un tipo de valor que acepta valores NULL. Si ambos operandos tienen valores que no son Nothing, la operación se realiza en los valores subyacentes de los operandos, como si ninguno fuera un tipo de valor que acepta valores NULL. En el ejemplo siguiente, las variables compare1 y sum1 tienen tipos implícitos. Si coloca el puntero del mouse sobre ellas, verá que el compilador deduce tipos de valor que aceptan valores NULL para ambas.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

Si uno o ambos operandos tienen un valor de Nothing, el resultado será Nothing.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Uso de tipos que aceptan valores NULL con datos

Una base de datos es uno de los lugares más importantes para usar tipos de valor que aceptan valores NULL. No todos los objetos de base de datos admiten actualmente tipos de valor que aceptan valores NULL, pero sí lo hacen los adaptadores de tabla generados por el diseñador. Vea Compatibilidad del objeto TableAdapter con los tipos que aceptan valores NULL.

Consulte también