Типы значения, допускающие 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.

См. также