Типы значения, допускающие Null (Visual Basic)
Иногда вы работаете с типом значения, который не имеет определенного значения в определенных обстоятельствах. Например, поле в базе данных может отличаться от присвоенного значения, понятного и не имеющего назначенного значения. Типы значений можно расширить, чтобы принимать обычные значения или значение NULL. Такое расширение называется типом, допускаемым значением NULL.
Каждый тип значения, допускающий значение NULL, создается из универсальной Nullable<T> структуры. Рассмотрим базу данных, которая отслеживает действия, связанные с работой. В следующем примере создается тип, допускающий значение NULL, и объявляется переменная Boolean
этого типа. Объявление можно написать тремя способами:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
Переменная ridesBusToWork
может содержать значение , значение True
или нет никакого False
значения. Его начальное значение по умолчанию вообще не является значением, которое в данном случае может означать, что информация еще не была получена для этого человека. В отличие от этого, может означать, False
что информация была получена, и человек не ездит на автобусе для работы.
Можно объявить переменные и свойства с типами значений, допускающих значение NULL, и можно объявить массив с элементами типа значения, допускающего значение NULL. Вы можете объявить процедуры с типами значений, допускающих значение NULL, в качестве параметров, и вы можете вернуть тип значения NULL из Function
процедуры.
Нельзя создать тип, допускающий значение NULL, для ссылочного типа, например массива, класса String
или класса. Базовый тип должен быть типом значения. Для получения дополнительной информации см. Value Types and Reference Types.
Использование переменной типа, допускающей значение NULL
Наиболее важными элементами типа значения, допускающего значение NULL, являются его HasValue и Value свойства. Для переменной типа значения, допускающего значение NULL, HasValue указывает, содержит ли переменная определенное значение. Если HasValue есть True
, можно считывать значение из Value. Обратите внимание, что оба HasValue и Value являются ReadOnly
свойствами.
Значения по умолчанию
При объявлении переменной с типом значения, допускающего значение NULL, его HasValue свойство имеет значение False
по умолчанию. Это означает, что по умолчанию переменная не имеет определенного значения, а не значения по умолчанию базового типа значения. В следующем примере переменная numberOfChildren
изначально не имеет определенного значения, даже если значение по умолчанию типа Integer
равно 0.
Dim numberOfChildren? As Integer
Значение NULL полезно для указания неопределенного или неизвестного значения. Если numberOfChildren
бы он был объявлен как Integer
, то не было бы никакого значения, указывающего, что информация в настоящее время недоступна.
Хранение значений
Значение хранится в переменной или свойстве типа значения, допускающего значение NULL, как правило. В следующем примере для переменной numberOfChildren
, объявленной в предыдущем примере, присваивается значение.
numberOfChildren = 2
Если переменная или свойство типа значения, допускающего значение NULL, содержит определенное значение, можно привести к тому, что он отменить изменения к исходному состоянию не назначенного значения. Для этого присвойте переменной или свойству значение Nothing
, как показано в следующем примере.
numberOfChildren = Nothing
Примечание.
Хотя можно назначить Nothing
переменную типа значения, допускающего значение NULL, его нельзя проверить Nothing
с помощью знака равенства. Сравнение, использующее знак равенства, someVar = Nothing
всегда вычисляется Nothing
. Свойство переменной HasValue можно проверить для False
или проверить с помощью Is
оператора или IsNot
оператора.
Получение значений
Чтобы получить значение переменной типа значения, допускающего значение NULL, сначала необходимо проверить его HasValue свойство, чтобы убедиться, что он имеет значение. Если вы пытаетесь прочитать значение, когда HasValue это False
, Visual Basic создает InvalidOperationException исключение. В следующем примере показан рекомендуемый способ чтения переменной numberOfChildren
предыдущих примеров.
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If
Сравнение типов, допускающих значение NULL
Если переменные, допускающие Boolean
значение NULL, используются в логических выражениях, результат может быть True
, False
или Nothing
. Ниже приведена таблица истины для And
и Or
. Так как b1
теперь b2
имеется три возможных значения, для оценки необходимо выполнить девять сочетаний.
b1 | Б2 | b1 И b2 | b1 Или 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
, оно не является ни false
тем, ниtrue
. Рассмотрим следующий пример.
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
значение . В результате Else
предложение выполняется в каждой If
инструкции, и выходные данные приведены следующим образом:
Expression is not true
Expression is not false
Примечание.
AndAlso
и OrElse
, которые используют оценку короткого канала, должны оценивать их второй операнды, когда первая оценивается Nothing
.
Распространение
Если один или оба операнды арифметического, сравнения, смены или операции типа являются типом значений, допускающим значение NULL, результат операции также является типом значений, допускающим значение NULL. Если оба операнда имеют значения, которые не Nothing
являются, операция выполняется для базовых значений операндов, как если бы ни был тип значения null. В следующем примере переменные compare1
и sum1
неявно типизированные. Если вы наведите указатель мыши на них, вы увидите, что компилятор вводит типы значений, допускающих значение NULL для обоих из них.
' 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
.
' 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, с данными
База данных является одним из наиболее важных мест для использования типов значений, допускающих значение NULL. В настоящее время не все объекты базы данных поддерживают типы значений, допускающие значение NULL, но адаптеры таблиц, созданные конструктором. См. сведения о поддержке TableAdapter для типов, допускающих значение NULL.