Compartir a través de


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 puede tener que distinguir entre tener un valor asignado que sea 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 denomina un tipo que acepta valores NULL.

Cada tipo de valor anulable se construye a partir de la estructura genérica Nullable<T>. Considere una base de datos que realiza un seguimiento de las actividades relacionadas con el trabajo. En el ejemplo siguiente, se construye un tipo anulable Boolean y se declara una variable de ese tipo anulable. 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. El valor predeterminado inicial no tiene ningún valor, lo que en este caso podría significar que la información aún no se ha obtenido para esta persona. En cambio, False podría significar que la información se ha obtenido y la persona no conduce el autobús para trabajar.

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 a partir de un Function procedimiento.

No se puede construir un tipo anulable en un tipo de referencia como una matriz, una String o una clase. El tipo subyacente debe ser un tipo de valor. Para obtener más información, vea Tipos de valor y tipos de referencia.

Uso de una variable de tipo anulable

Los miembros más importantes de un tipo de valor anulable son sus propiedades HasValue y Value. Para 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 de 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 HasValue propiedad tiene un valor predeterminado de False. Esto significa que, de forma 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 Integer tipo es 0.

Dim numberOfChildren? As Integer

Un valor NULL es útil para indicar un valor indefinido 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.

Almacenar valores

Se almacena un valor 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 al estado inicial de no tener asignado un valor. 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. Comparación que usa el signo igual, someVar = Nothing, siempre se evalúa como Nothing. Puede probar la propiedad HasValue de la variable usando False, o bien mediante el operador Is o IsNot.

Recuperación de valores

Para recuperar el valor de una variable de un tipo de valor anulable, primero debe verificar su propiedad HasValue para confirmar que tiene un valor. Si intenta leer el valor cuando HasValue es False, Visual Basic produce una InvalidOperationException excepción. 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 anulables

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

b1 b2 b1 y b2 b1 o 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

Cuando el valor de una variable booleana o expresión es Nothing, no es ni truefalse. 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 Else cláusula se ejecuta en cada If instrucción 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, comparación, desplazamiento o tipo es de un tipo de valor nullable, el resultado de la operación también es de un tipo de valor nullable. 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 de un tipo de valor anulable. En el ejemplo siguiente, las variables compare1 y sum1 se escriben implícitamente. Si coloca el puntero del mouse sobre ellos, verá que el compilador deduce tipos de valor anulables para ambos.

' 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 anulables 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. Consulte Compatibilidad con TableAdapter para tipos que aceptan valores NULL.

Consulte también