Типы значения, допускающие Null (Visual Basic)Nullable Value Types (Visual Basic)

Иногда вы работаете с типом значения, который не имеет определенного значения в определенных обстоятельствах.Sometimes you work with a value type that does not have a defined value in certain circumstances. Например, поле в базе данных может отличаться от присвоенного значения, которое является осмысленным и не имеет присвоенного значения.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. Типы значений могут быть расширены для получения их нормальных значений или значения NULL.Value types can be extended to take either their normal values or a null value. Такое расширение называется типом, допускающим значение NULL.Such an extension is called a nullable type.

Каждый тип, допускающий значение null, создается из общей структуры Nullable<T>.Each nullable type is constructed from the generic Nullable<T> structure. Рассмотрим базу данных, которая отслеживает действия, связанные с работой.Consider a database that tracks work-related activities. В следующем примере создается тип Nullable Boolean и объявляется переменная этого типа.The following example constructs a nullable Boolean type and declares a variable of that type. Объявление можно написать тремя способами:You can write the declaration in three ways:

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

Переменная ridesBusToWork может содержать значение True, значение False или вообще не имеет значения.The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Его начальное значение по умолчанию — вообще не имеет значения, что в данном случае может означать, что данные еще не были получены для этого пользователя.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. В отличие от этого, False может означать, что информация получена и пользователь не передается на шину.In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

Можно объявить переменные и свойства с типами, допускающими значение null, и можно объявить массив с элементами типа, допускающего значение null.You can declare variables and properties with nullable types, and you can declare an array with elements of a nullable type. В качестве параметров можно объявить процедуры с типами, допускающими значение null, и можно вернуть тип, допускающий значение null, из процедуры Function.You can declare procedures with nullable types as parameters, and you can return a nullable type from a Function procedure.

Нельзя создать тип, допускающий значение null, для ссылочного типа, такого как массив, String или класс.You cannot construct a nullable type on a reference type such as an array, a String, or a class. Базовый тип должен быть типом значения.The underlying type must be a value type. Для получения дополнительной информации см. Value Types and Reference Types.For more information, see Value Types and Reference Types.

Использование переменной типа, допускающей значение nullUsing a Nullable Type Variable

Наиболее важными членами типа, допускающего значение null, являются свойства HasValue и Value.The most important members of a nullable type are its HasValue and Value properties. Для переменной типа, допускающего значение null, HasValue указывает, содержит ли переменная определенное значение.For a variable of a nullable type, HasValue tells you whether the variable contains a defined value. Если HasValue равно True, можно считать значение из Value.If HasValue is True, you can read the value from Value. Обратите внимание, что HasValue и Value являются свойствами ReadOnly.Note that both HasValue and Value are ReadOnly properties.

Значения по умолчаниюDefault Values

При объявлении переменной с типом, допускающим значение null, ее свойство HasValue имеет значение по умолчанию False.When you declare a variable with a nullable type, its HasValue property has a default value of False. Это означает, что по умолчанию переменная не имеет определенного значения, а не значения по умолчанию базового типа значения.This means that by default the variable has no defined value, instead of the default value of its underlying value type. В следующем примере переменная numberOfChildren изначально не имеет определенного значения, несмотря на то, что значение по умолчанию для типа Integer равно 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

Значение NULL полезно для указания неопределенного или неизвестного значения.A null value is useful to indicate an undefined or unknown value. Если numberOfChildren было объявлено как Integer, то не будет значения, которое может означать, что информация в настоящее время недоступна.If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

Сохранение значенийStoring Values

Вы сохраняете значение в переменной или свойстве типа, допускающего значение null, обычным способом.You store a value in a variable or property of a nullable type in the typical way. В следующем примере присваивается значение переменной numberOfChildren, объявленной в предыдущем примере.The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Если переменная или свойство типа, допускающего значение null, содержит определенное значение, можно вернуть его первоначальное состояние, не имеющее присвоенного значения.If a variable or property of a nullable type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. Для этого нужно задать для переменной или свойства значение Nothing, как показано в следующем примере.You do this by setting the variable or property to Nothing, as the following example shows.

numberOfChildren = Nothing

Примечание

Можно назначить Nothing переменной типа, допускающего значение null, но нельзя проверить его для Nothing с помощью знака равенства.Although you can assign Nothing to a variable of a nullable type, you cannot test it for Nothing by using the equal sign. При сравнении, в котором используется знак равенства, someVar = Nothing, всегда вычисляется значение Nothing.Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing. Можно проверить свойство переменной HasValue для False или проверить с помощью оператора Is или IsNot.You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

Получение значенийRetrieving Values

Чтобы получить значение переменной типа, допускающего значение null, сначала следует проверить его свойство HasValue, чтобы убедиться, что оно имеет значение.To retrieve the value of a variable of a nullable type, you should first test its HasValue property to confirm that it has a value. Если попытаться считать значение, если HasValue равно False, Visual Basic выдаст исключение InvalidOperationException.If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception. В следующем примере показан рекомендуемый способ чтения переменной numberOfChildren из предыдущих примеров.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

Сравнение типов, допускающих значение nullComparing Nullable Types

Если в логических выражениях используются значения NULL Boolean, результат может быть True, False или Nothing.When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. Ниже приведена таблица истинности для And и Or.The following is the truth table for And and Or. Поскольку b1 и b2 теперь имеют три возможных значения, можно вычислить девять комбинаций.Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

B1b1 ячейкb2 B1 и B2b1 And b2 B1 или 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

Если значение логической переменной или выражения равно Nothing, то оно не является ни true, ни false.When the value of a Boolean variable or expression is Nothing, it is neither true nor false. Рассмотрим следующий пример.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

В этом примере b1 And b2 принимает значение Nothing.In this example, b1 And b2 evaluates to Nothing. В результате предложение Else выполняется в каждой инструкции If, и выходные данные выглядят следующим образом: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

Примечание

AndAlso и OrElse, которые используют сокращенную оценку, должны оценивать свои вторые операнды, когда первый оценивается как Nothing.AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

РаспространениеPropagation

Если один или оба операнда арифметических операций, операции сравнения, сдвига или типа допускают значение null, результат операции также может допускать значение null.If one or both of the operands of an arithmetic, comparison, shift, or type operation is nullable, the result of the operation is also nullable. Если оба операнда имеют значения, которые не Nothing, операция выполняется с базовыми значениями операндов, как если бы ни был тип, допускающий значение 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 type. В следующем примере переменные compare1 и sum1 неявно типизированы.In the following example, variables compare1 and sum1 are implicitly typed. Если навести на них указатель мыши, вы увидите, что компилятор выводит типы, допускающие значение null, для обоих типов.If you rest the mouse pointer over them, you will see that the compiler infers nullable 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}")

Если один или оба операнда имеют значение Nothing, результат будет 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>")}")

Использование типов, допускающих значение null, с даннымиUsing Nullable Types with Data

База данных является одним из наиболее важных мест для использования типов, допускающих значение null.A database is one of the most important places to use nullable types. Не все объекты базы данных в настоящее время поддерживают типы, допускающие значение null, но адаптеры таблиц, созданные конструктором, выполняют.Not all database objects currently support nullable types, but the designer-generated table adapters do. См. раздел Поддержка TableAdapter для типов, допускающих значение NULL.See TableAdapter support for nullable types.

См. такжеSee also