場合によっては、特定の状況で定義された値を持たない値型を使用することがあります。 たとえば、データベース内のフィールドでは、意味のある割り当て値と割り当てられた値がない値を区別する必要がある場合があります。 値型は、通常の値または null 値を受け取るように拡張できます。 このような拡張機能は null 許容型と呼ばれます。
各 null 許容値型は、ジェネリック Nullable<T> 構造体から構築されます。 作業関連のアクティビティを追跡するデータベースを考えてみましょう。 次の例では、null 許容 Boolean
型を構築し、その型の変数を宣言します。 宣言は、次の 3 つの方法で記述できます。
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
変数 ridesBusToWork
は、 True
の値、 False
の値、またはまったく値を保持できません。 その初期の既定値はまったく値ではありません。この場合は、このユーザーの情報がまだ取得されていないことを意味する可能性があります。 これに対し、 False
は、情報が取得され、その人がバスに乗って仕事をしていないことを意味する可能性があります。
null 許容値型を使用して変数とプロパティを宣言したり、null 許容値型の要素を含む配列を宣言したりできます。 null 許容値型を持つプロシージャをパラメーターとして宣言でき、 Function
プロシージャから null 許容値型を返すことができます。
配列、 String
、クラスなどの参照型に null 許容型を構築することはできません。 基になる型は値型である必要があります。 詳細については、「 値の型と参照型」を参照してください。
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
注
null 許容値型の変数に 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 許容型の比較
ブール式で null 許容 Boolean
変数が使用されている場合、結果は True
、 False
、または Nothing
できます。
And
とOr
の真理表を次に示します。
b1
とb2
には 3 つの値が使用可能になったため、評価する組み合わせは 9 つあります。
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
に評価されます。 その結果、各 If
ステートメントで Else
句が実行され、出力は次のようになります。
Expression is not true
Expression is not false
注
AndAlso
および OrElse
(短絡評価を使用する)は、最初のオペランドが Nothing
に評価されたときに、2 番目のオペランドを評価する必要があります。
伝播
算術演算、比較演算、シフト演算、または型演算のオペランドの一方または両方が 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 許容値型を使用する最も重要な場所の 1 つです。 現在、すべてのデータベース オブジェクトが null 許容値型をサポートしているわけではありませんが、デザイナーによって生成されたテーブル アダプターではサポートされます。 null 許容型の TableAdapter のサポートを参照してください。
こちらも参照ください
.NET