Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Иногда вы работаете с типом значения, который не имеет определенного значения в определенных обстоятельствах. Например, в базе данных поле может различать между назначенным значением, которое имеет смысл, и отсутствием назначенного значения. Типы значений можно расширить, чтобы принимать обычные значения или значение 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
или класса. Базовый тип должен быть типом значения. Дополнительные сведения см. в разделе "Типы значений" и "Ссылочные типы".
Использование переменной типа, допускающей значение 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
переменной допустимого нулевого типа, её нельзя проверять на 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
, оно не является ни true
, ни false
. Рассмотрим следующий пример.
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
, операция выполняется над их базовыми значениями, как если бы они не были значениями nullable. В следующем примере переменные 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.