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 False
o 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.