Типы значения, допускающие Null (Visual Basic)Nullable Value Types (Visual Basic)

Иногда вы работаете с типом значения, который не имеет определенного значения в определенных обстоятельствах.Sometimes you work with a value type that does not have a defined value in certain circumstances. Например, поле в базе данных может иметь различие между наличием значимого значения и не имеющим назначенного значения.For example, a field in a database might have to distinguish between having an assigned value that is meaningful and not having an assigned value. Типы значений могут быть расширены, чтобы взять либо их нормальные значения, либо нулевое значение.Value types can be extended to take either their normal values or a null value. Такое расширение называется недействительным типом.Such an extension is called a nullable type.

Каждый недействительный тип значения Nullable<T> построен из общей структуры.Each nullable value type is constructed from the generic Nullable<T> structure. Рассмотрим базу данных, которая отслеживает действия, связанные с работой.Consider a database that tracks work-related activities. Следующий пример строит недействительный Boolean тип и объявляет переменную этого типа.The following example constructs a nullable Boolean type and declares a variable of that type. Заявление можно написать тремя способами:You can write the declaration in three ways:

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

Переменная ridesBusToWork может содержать Trueзначение, Falseзначение, или нет значения вообще.The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Его начальное значение по умолчанию не является значением вообще, что в этом случае может означать, что информация еще не была получена для этого человека.Its initial default value is no value at all, which in this case could mean that the information has not yet been obtained for this person. В отличие False от этого, может означать, что информация была получена, и человек не едет на автобусе на работу.In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

Вы можете декларировать переменные и свойства с необыдательными типами значений, а также объявлять массив с элементами необдуманного типа значения.You can declare variables and properties with nullable value types, and you can declare an array with elements of a nullable value type. В качестве параметров можно объявить процедуры с необыдаными типами значений, а также вернуть из Function процедуры несоизглаенный тип значения.You can declare procedures with nullable value types as parameters, and you can return a nullable value type from a Function procedure.

Вы не можете построить недействительный тип на Stringтипе ссылки, например массив, a или класс.You cannot construct a nullable type on a reference type such as an array, a String, or a class. Базовым типом должен быть тип значения.The underlying type must be a value type. Для получения дополнительной информации см.For more information, see Value Types and Reference Types.

Использование переменной nullable ТипаUsing a Nullable Type Variable

Наиболее важными членами несоизлучаемого типа значения являются его HasValue свойства и Value свойства.The most important members of a nullable value type are its HasValue and Value properties. Для переменной необнутивной тип HasValue значения, показывает, содержит ли переменная определенное значение.For a variable of a nullable value type, HasValue tells you whether the variable contains a defined value. Если HasValue Trueэто, вы можете Valueпрочитать значение от .If HasValue is True, you can read the value from Value. Обратите внимание, Value ReadOnly что оба HasValue свойства и являются свойствами.Note that both HasValue and Value are ReadOnly properties.

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

Когда вы объявляете переменную с необыдательным типом значения, ее HasValue свойство имеет значение по Falseумолчанию.When you declare a variable with a nullable value type, its HasValue property has a default value of False. Это означает, что по умолчанию переменная не имеет определенного значения, а не значение по умолчанию своего базового типа значения.This means that by default the variable has no defined value, instead of the default value of its underlying value type. В следующем примере numberOfChildren переменная изначально не имеет определенного значения, даже если значение Integer типа по умолчанию составляет 0.In the following example, the variable numberOfChildren initially has no defined value, even though the default value of the Integer type is 0.

Dim numberOfChildren? As Integer

Нулевое значение полезно для обозначения неопределенного или неизвестного значения.A null value is useful to indicate an undefined or unknown value. Если numberOfChildren бы было Integerобъявлено, не было бы значения, которое могло бы указывать на то, что информация в настоящее время недоступна.If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

Хранение ценностейStoring Values

Вы храните значение в переменной или свойстве нулевого типа значения типичным способом.You store a value in a variable or property of a nullable value type in the typical way. Следующий пример присваивает numberOfChildren значение переменной, заявленной в предыдущем примере.The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Если переменная или свойство нулевого типа значения содержит определенное значение, вы можете заставить ее вернуться к исходному состоянию, не имеющего значения, назначенного.If a variable or property of a nullable value type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. Вы делаете это, устанавливая Nothingпеременную или свойство, как показано в следующем примере.You do this by setting the variable or property to Nothing, as the following example shows.

numberOfChildren = Nothing

Примечание

Хотя вы можете Nothing назначить переменную нулевого типа значения, Nothing вы не можете проверить его с помощью равного знака.Although you can assign Nothing to a variable of a nullable value type, you cannot test it for Nothing by using the equal sign. Сравнение, которое someVar = Nothingиспользует равный Nothingзнак, всегда оценивает .Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing. Вы HasValue можете проверить свойство Falseпеременной для, Is или IsNot проверить с помощью оператора.You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

Получение значенийRetrieving Values

Чтобы получить значение переменной нулевой типа значения, необходимо сначала HasValue проверить ее свойство, чтобы подтвердить, что она имеет значение.To retrieve the value of a variable of a nullable value type, you should first test its HasValue property to confirm that it has a value. Если вы попытаетесь HasValue прочитать значение, когда это, FalseVisual Basic бросает InvalidOperationException исключение.If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception. Ниже приводится рекомендуемый способ чтения numberOfChildren переменной предыдущих примеров.The following example shows the recommended way to read the variable numberOfChildren of the previous examples.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Сравнение недействительных типовComparing Nullable Types

Когда недействительные Boolean переменные используются в выражениях TrueBoolean, результат может быть, Falseили Nothing.When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. Ниже приведена таблица And Orправды для и .The following is the truth table for And and Or. Потому что b1 и b2 теперь есть три возможных значения, Есть девять комбинаций для оценки.Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

b1b1 B2b2 b1 И b2b1 And b2 b1 Или b2b1 Or 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

Когда значение переменной Boolean или Nothingвыражения, true это falseне является ни .When the value of a Boolean variable or expression is Nothing, it is neither true nor false. Рассмотрим следующий пример.Consider the following example.

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оценивается.In this example, b1 And b2 evaluates to Nothing. В результате Else положение выполняется в If каждом заявлении, и вывод следующий:As a result, the Else clause is executed in each If statement, and the output is as follows:

Expression is not true

Expression is not false

Примечание

AndAlsoи OrElse, которые используют оценку короткого замыкания, должны оценить Nothingсвои вторые оперы, когда первый оценивает .AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

РаспространениеPropagation

Если одна или обе операции арифметики, сравнения, переноса или типа являются необоснованной типом значения, результат операции также является необоснованной типом значения.If one or both of the operands of an arithmetic, comparison, shift, or type operation is a nullable value type, the result of the operation is also a nullable value type. Если оба операции имеют значения, которые Nothingне являются, операция выполняется на основных значениях operands, как если бы ни один из них не был необоснованного типа значения.If both operands have values that are not Nothing, the operation is performed on the underlying values of the operands, as if neither were a nullable value type. В следующем примере compare1 переменные и sum1 неявно набраны.In the following example, variables compare1 and sum1 are implicitly typed. Если вы полежите указателем мыши над ними, вы увидите, что компилятор вычеркивает недействительные типы значений для обоих из них.If you rest the mouse pointer over them, you will see that the compiler infers nullable value types for both of them.

' 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}")

Если один или оба operands Nothingимеют значение, Nothingрезультат будет .If one or both operands have a value of Nothing, the result will be 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>")}")

Использование недействительных типов с даннымиUsing Nullable Types with Data

База данных является одним из наиболее важных мест для использования недействительных типов значений.A database is one of the most important places to use nullable value types. В настоящее время не все объекты базы данных поддерживают необнудаемые типы значений, но адаптеры таблиц, созданные дизайнером, поддерживаются.Not all database objects currently support nullable value types, but the designer-generated table adapters do. Смотрите поддержку TableAdapter для недействительных типов.See TableAdapter support for nullable types.

См. такжеSee also