Поделиться через


Типы значений, допускающие нулевые значения (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или класса. Базовый тип должен быть типом значения. Дополнительные сведения см. в разделе "Типы значений" и "Ссылочные типы".

Использование переменной типа, допускающей значение 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.

См. также