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. 値型は、通常の値または null 値を受け取るように拡張できます。Value types can be extended to take either their normal values or a null value. このような拡張機能は、 null 許容型と呼ばれます。Such an extension is called a nullable type.

各 null 許容型は、ジェネリック Nullable<T> 構造体から構築されます。Each nullable type is constructed from the generic Nullable<T> structure. 作業に関連するアクティビティを追跡するデータベースについて考えてみましょう。Consider a database that tracks work-related activities. 次の例では、null 許容の Boolean 型を構築し、その型の変数を宣言します。The following example constructs a nullable Boolean type and declares a variable of that type. 宣言は、次の3つの方法で記述できます。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.

Null 許容型を使用して変数とプロパティを宣言できます。また、null 許容型の要素を使用して配列を宣言できます。You can declare variables and properties with nullable types, and you can declare an array with elements of a nullable type. Null 許容型を持つプロシージャをパラメーターとして宣言し、Function プロシージャから null 許容型を返すことができます。You can declare procedures with nullable types as parameters, and you can return a nullable type from a Function procedure.

配列、String、クラスなどの参照型に対して null 許容型を構築することはできません。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. 詳細については、「 Value Types and Reference Types」を参照してください。For more information, see Value Types and Reference Types.

Null 許容型変数の使用Using a Nullable Type Variable

Null 許容型の最も重要なメンバーは、その HasValueValue のプロパティです。The most important members of a nullable type are its HasValue and Value properties. Null 許容型の変数の場合、HasValue は、変数に定義済みの値が含まれているかどうかを示します。For a variable of a nullable type, HasValue tells you whether the variable contains a defined value. HasValueTrue場合は、Valueから値を読み取ることができます。If HasValue is True, you can read the value from Value. HasValueValue はどちらも ReadOnly プロパティであることに注意してください。Note that both HasValue and Value are ReadOnly properties.

既定値Default Values

Null 許容型の変数を宣言すると、その HasValue プロパティの既定値 Falseが使用されます。When you declare a variable with a nullable 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. 次の例では、Integer 型の既定値が0の場合でも、変数 numberOfChildren 最初は定義済みの値を持ちません。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

Null 値は、未定義または不明な値を示すために役立ちます。A null value is useful to indicate an undefined or unknown value. numberOfChildrenIntegerとして宣言されている場合、情報が現在使用できないことを示す値は存在しません。If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.

格納 (値を)Storing Values

値は、通常の方法で null 許容型の変数またはプロパティに格納します。You store a value in a variable or property of a nullable type in the typical way. 次の例では、前の例で宣言した numberOfChildren 変数に値を代入します。The following example assigns a value to the variable numberOfChildren declared in the previous example.

numberOfChildren = 2

Null 許容型の変数またはプロパティに定義済みの値が含まれている場合は、値が割り当てられていない初期状態に戻すことができます。If a variable or property of a nullable 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 を null 許容型の変数に割り当てることはできますが、等号を使用して Nothing をテストすることはできません。Although you can assign Nothing to a variable of a nullable 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. Falseに対して変数の HasValue プロパティをテストしたり、Is または IsNot 演算子を使用してテストしたりできます。You can test the variable's HasValue property for False, or test by using the Is or IsNot operator.

取得 (値を)Retrieving Values

Null 許容型の変数の値を取得するには、まずその HasValue プロパティをテストして、値があることを確認する必要があります。To retrieve the value of a variable of a nullable type, you should first test its HasValue property to confirm that it has a value. HasValueFalseときに値を読み込んだ場合、Visual 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

Null 許容型の比較Comparing Nullable Types

Null 値を許容する Boolean 変数がブール式で使用される場合、結果は TrueFalse、または Nothingになります。When nullable Boolean variables are used in Boolean expressions, the result can be True, False, or Nothing. AndOrの真理テーブルを次に示します。The following is the truth table for And and Or. b1b2 は3つの値を持つことができるため、評価するのは9つの組み合わせです。Because b1 and b2 now have three possible values, there are nine combinations to evaluate.

Bb1 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

ブール型の変数または式の値が Nothing場合、truefalseもありません。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 b2Nothingに評価されます。In this example, b1 And b2 evaluates to Nothing. その結果、各 If ステートメントで Else 句が実行され、出力は次のようになります。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に評価されるときに、2番目のオペランドを評価する必要があります。AndAlso and OrElse, which use short-circuit evaluation, must evaluate their second operands when the first evaluates to Nothing.

伝達Propagation

算術演算、比較演算子、シフト演算、または型演算のオペランドの一方または両方が null 値を許容する場合、演算の結果も null 値を許容します。If one or both of the operands of an arithmetic, comparison, shift, or type operation is nullable, the result of the operation is also nullable. 両方のオペランドの値が Nothingでない場合は、オペランドの基になる値に対して演算が実行されますが、どちらも null 許容型ではありません。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 type. 次の例では、変数 compare1 および sum1 が暗黙的に型指定されています。In the following example, variables compare1 and sum1 are implicitly typed. これらの上にマウスポインターを置くと、その両方の null 許容型がコンパイラによって推論されます。If you rest the mouse pointer over them, you will see that the compiler infers nullable 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}")

一方または両方のオペランドの値が 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>")}")

データでの Null 許容型の使用Using Nullable Types with Data

データベースは、null 許容型を使用する最も重要な場所の1つです。A database is one of the most important places to use nullable types. 現在、すべてのデータベースオブジェクトが null 許容型をサポートしているわけではありませんが、デザイナーによって生成されたテーブルアダプターでは、Not all database objects currently support nullable types, but the designer-generated table adapters do. TableAdapter による null 許容型のサポート」を参照してください。See TableAdapter support for nullable types.

関連項目See also