Tipos que admiten valores null (Visual Basic)Nullable Value Types (Visual Basic)

A veces se trabaja con un tipo de valor que no tiene un valor definido en determinadas circunstancias.Sometimes you work with a value type that does not have a defined value in certain circumstances. Por ejemplo, un campo de una base de datos podría tener que distinguir entre tener un valor asignado que sea significativo y que no tenga un valor asignado.For example, a field in a database might have to distinguish between having an assigned value that is meaningful and not having an assigned value. Los tipos de valor se pueden extender para tomar sus valores normales o un valor null.Value types can be extended to take either their normal values or a null value. Dicha extensión se denomina un tipo que acepta valores NULL.Such an extension is called a nullable type.

Cada tipo de valor que acepta valores NULL se construye a partir de la Nullable<T> estructura genérica.Each nullable value type is constructed from the generic Nullable<T> structure. Considere una base de datos que realice un seguimiento de las actividades relacionadas con el trabajo.Consider a database that tracks work-related activities. En el ejemplo siguiente se crea un tipo que acepta valores NULL Boolean y se declara una variable de ese tipo.The following example constructs a nullable Boolean type and declares a variable of that type. Puede escribir la declaración de tres maneras:You can write the declaration in three ways:

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.The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Su valor predeterminado inicial es ningún valor, que en este caso podría significar que la información no se ha obtenido todavía para esta persona.Its initial default value is no value at all, which in this case could mean that the information has not yet been obtained for this person. Por el contrario, False podría significar que se ha obtenido la información y que la persona no pasa el bus para que funcione.In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

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.You can declare variables and properties with nullable value types, and you can declare an array with elements of a nullable value type. 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 de un Function procedimiento.You can declare procedures with nullable value types as parameters, and you can return a nullable value type from a Function procedure.

No se puede crear un tipo que acepta valores NULL en un tipo de referencia, como una matriz, una String o una clase.You cannot construct a nullable type on a reference type such as an array, a String, or a class. El tipo subyacente debe ser un tipo de valor.The underlying type must be a value type. Para obtener más información, vea tipos de valor y tipos de referencia.For more information, see Value Types and Reference Types.

Usar una variable de tipo que acepta valores NULLUsing a Nullable Type Variable

Los miembros más importantes de un tipo de valor que acepta valores NULL son sus HasValue Value propiedades y.The most important members of a nullable value type are its HasValue and Value properties. En el caso de una variable de un tipo de valor que acepta valores NULL, HasValue indica si la variable contiene un valor definido.For a variable of a nullable value type, HasValue tells you whether the variable contains a defined value. Si HasValue es True , puede leer el valor de Value .If HasValue is True, you can read the value from Value. Tenga en cuenta que HasValue y Value son ReadOnly propiedades.Note that both HasValue and Value are ReadOnly properties.

Valores predeterminadosDefault Values

Cuando se declara una variable con un tipo de valor que acepta valores NULL, su HasValue propiedad tiene un valor predeterminado de False .When you declare a variable with a nullable value type, its HasValue property has a default value of 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.This means that by default the variable has no defined value, instead of the default value of its underlying value type. En el ejemplo siguiente, la variable numberOfChildren inicialmente no tiene ningún valor definido, aunque el valor predeterminado del Integer tipo sea 0.In the following example, the variable numberOfChildren initially has no defined value, even though the default value of the Integer type is 0.

Dim numberOfChildren? As Integer

Un valor NULL es útil para indicar un valor no definido o desconocido.A null value is useful to indicate an undefined or unknown value. Si se numberOfChildren hubiera declarado como Integer , no habría ningún valor que pudiera indicar que la información no está disponible actualmente.If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

Almacenar valoresStoring Values

Puede almacenar un valor en una variable o propiedad de un tipo de valor que acepta valores NULL de la manera habitual.You store a value in a variable or property of a nullable value type in the typical way. En el ejemplo siguiente se asigna un valor a la variable numberOfChildren declarada en el ejemplo anterior.The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Si una variable o propiedad de un tipo de valor que acepta valores NULL contiene un valor definido, puede hacer que revierta a su estado inicial de no tener asignado un valor.If a variable or property of a nullable value type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. Para ello, establezca la variable o la propiedad en Nothing , como se muestra en el ejemplo siguiente.You do this by setting the variable or property to Nothing, as the following example shows.

numberOfChildren = Nothing

Nota

Aunque puede asignar Nothing a una variable de un tipo de valor que acepta valores NULL, no puede probarla con Nothing el signo igual.Although you can assign Nothing to a variable of a nullable value type, you cannot test it for Nothing by using the equal sign. La comparación que usa el signo igual, someVar = Nothing , siempre se evalúa como Nothing .Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing. Puede probar la propiedad de la variable HasValue para False o probar mediante el Is IsNot operador OR.You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

Recuperación de valoresRetrieving Values

Para recuperar el valor de una variable de un tipo de valor que acepta valores NULL, primero debe probar su HasValue propiedad para confirmar que tiene un valor.To retrieve the value of a variable of a nullable value type, you should first test its HasValue property to confirm that it has a value. Si intenta leer el valor cuando HasValue es False , Visual Basic produce una InvalidOperationException excepción.If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception. En el ejemplo siguiente se muestra la forma recomendada de leer la variable numberOfChildren de los ejemplos anteriores.The following example shows the recommended way to read the variable numberOfChildren of the previous examples.

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

Comparar tipos que aceptan valores NULLComparing Nullable Types

Cuando Boolean se usan variables que aceptan valores NULL en Expresiones booleanas, el resultado puede ser True , False o Nothing .When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. A continuación se encuentra la tabla de verdad para And y Or .The following is the truth table for And and Or. Dado que b1 y b2 ahora tienen tres valores posibles, hay nueve combinaciones que evaluar.Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

B1b1 B2b2 B1 y B2b1 And b2 B1 o B2b1 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

Cuando el valor de una expresión o variable booleana es Nothing , no es true ni false .When the value of a Boolean variable or expression is Nothing, it is neither true nor false. Considere el ejemplo siguiente.Consider the following example.

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 .In this example, b1 And b2 evaluates to Nothing. Como resultado, la Else cláusula se ejecuta en cada If instrucción y el resultado es el siguiente:As a result, the Else clause is executed in each If statement, and the output is as follows:

Expression is not true

Expression is not false

Nota

AndAlso y OrElse , que usan la evaluación de cortocircuito, deben evaluar sus segundos operandos cuando el primero se evalúa como Nothing .AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

PropagaciónPropagation

Si uno o los dos 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 es también un tipo de valor que acepta valores NULL.If one or both of the operands of an arithmetic, comparison, shift, or type operation is a nullable value type, the result of the operation is also a nullable value type. Si ambos operandos tienen valores que no son Nothing , la operación se realiza en los valores subyacentes de los operandos, como si ninguno fuese un tipo de valor que acepta valores NULL.If both operands have values that are not Nothing, the operation is performed on the underlying values of the operands, as if neither were a nullable value type. En el ejemplo siguiente, las variables compare1 y sum1 se escriben implícitamente.In the following example, variables compare1 and sum1 are implicitly typed. Si coloca el puntero del mouse sobre ellos, verá que el compilador deduce los tipos de valor que aceptan valores NULL para ambos.If you rest the mouse pointer over them, you will see that the compiler infers nullable value types for both of them.

' 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 .If one or both operands have a value of Nothing, the result will be 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>")}")

Usar tipos que aceptan valores NULL con datosUsing Nullable Types with Data

Una base de datos es uno de los lugares más importantes para usar tipos de valor que aceptan valores NULL.A database is one of the most important places to use nullable value types. No todos los objetos de base de datos admiten actualmente tipos de valor que aceptan valores NULL, pero sí los adaptadores de tabla generados por el diseñador.Not all database objects currently support nullable value types, but the designer-generated table adapters do. Vea compatibilidad de TableAdapter con tipos que aceptan valores NULL.See TableAdapter support for nullable types.

Consulte tambiénSee also