Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 False
o 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
, False
o 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 true
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 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.