Типы значения Null

Обновлен: Ноябрь 2007

Иногда пользователь работает с типом значения, который в определенных обстоятельствах не имеет заданного значения. Например, поле в базе данных, возможно, должно будет отличать наличие присвоенного значения, имеющего смысл, и отсутствие присвоенного значения. Типы значений могут быть расширены чтобы принимать обычные значения или значение NULL. Такое расширение называется тип Nullable.

Каждый тип Nullable создается из общей структуры Nullable<T>. Рассмотрим базу данных, которая отслеживает связанные с работой действия. В следующем примере создается тип Nullable Boolean и объявляется переменная этого типа. Можно написать объявление тремя способами:

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

Переменная ridesBusToWork может содержать значение True, значение False или не содержать значения вообще. Его начальное значение по умолчанию не является значением вообще, и в данном случае это может означать, что данные не были еще получены для этого пользователя. Напротив, значение False может означать, что данные были получены.

Можно объявлять переменные и свойства с типами Nullable, и можно также объявлять массив элементов типа nullable. Можно объявить процедуру с типами Nullable в качестве параметров, и можно также возвращать тип nullable из процедуры Function.

Нельзя создать тип Nullable на ссылочном типе, таком как массив, String или класс. Базовый тип должен быть типом значения. Дополнительные сведения см. в разделе Типы значений и ссылочные типы.

Использование переменной типа Nullable

Наиболее важными членами типа Nullable являются его свойства HasValue и Value. При переменной типа nullable, HasValue указывает, содержит ли переменная заданное значение. Если HasValue имеет значение True, можно прочитать значение из Value. Следует отметить, что и HasValue, и Value являются свойствами ReadOnly.

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

При объявлении переменной с типом Nullable, свойство HasValue имеет значение False по умолчанию. Это означает, что по умолчанию переменная не имеет заданного значения вместо значения по умолчанию его базового типа значения. В следующем примере переменная numberOfChildren изначально не имеет заданного значения, даже если значение по умолчанию типа Integer равно 0.

Dim numberOfChildren? As Integer

Значение NULL полезно для обнаружения неопределенного или неизвестного значения. Если бы numberOfChildren была объявлена как Integer, но тогда не существовало бы значения, которое могло бы указать, что сведения не являются доступными в данный момент.

Хранимые значения

Сохраните значение в переменной или свойстве типа Nullable обычным способом. В следующем примере присваивается значение переменной numberOfChildren, объявленной в предыдущем примере.

numberOfChildren = 2

Если переменная или свойство типа Nullable содержит заданное значение, можно принудительно вернуть ее к исходному состоянию отсутствия заданного значения. Это можно сделать, задав переменную или свойство в Nothing, как показано в следующем примере.

numberOfChildren = Nothing
ms235245.alert_note(ru-ru,VS.90).gifПримечание.

Хотя можно присвоить значение Nothing для переменной nullable типа, но нельзя проверить ее на содержание значения Nothing с помощью знака равенства. Сравнение, использующее знак равенства, someVar = Nothing, всегда равно Nothing. Можно проверить свойства переменных HasValue на False, или проверить с помощью Is или оператора IsNot.

Извлечение значений

Для извлечения значения переменной nullable типа, следует сначала проверить его свойство 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

Сравнение типов Nullable

При использовании Nullable переменных Boolean в логических выражениях, результатами могут быть значения True, False или Nothing. Ниже приведена таблица истинности для And или Or. Поскольку b1 и b2 теперь имеют три возможных значения, получается девять комбинаций для оценки.

b1

b2

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

ms235245.alert_note(ru-ru,VS.90).gifПримечание.

AndAlso и OrElse, которые используют сокращенные вычисления, должны оценивать свои вторые операнды, когда первые операнды имеют значение Nothing.

Передача

Если один или оба операнда арифметики, сравнения, сдвига или тип операции относятся к типу nullable, результатом операции также является значение nullable. Если оба операнда имеют значения, которые не являются Nothing, операция выполняется на основных значениях операндов, как если бы ни одно из них не относилось к типу Nullable. В следующем примере переменные compare1 и sum1 заданы неявным образом. Если навести на них указатель мыши, видно, что компилятор выводит для них обоих типы Nullable.

' 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 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

Использование типов Nullable с данными

База данных является одной из наиболее важных сред, где используются типы Nullable. Не все объекты базы данных в настоящее время поддерживают типы Nullable, но их поддерживают адаптеры таблицы, созданные в конструкторе. См. раздел "Поддержка адаптером таблицы типов Nullable" в Общие сведения об адаптере таблиц.

См. также

Задачи

Устранение неполадок, связанных с типами данных

Основные понятия

Типы данных в Visual Basic

Типы значений и ссылочные типы

Общие сведения об адаптере таблиц

Вывод локального типа

Ссылки

InvalidOperationException

Оператор If

Другие ресурсы

Реализация типов данных