null 許容値型 (Visual Basic)
場合によっては、特定の状況で値が定義されていない値型を使用することがあります。 たとえば、データベースのフィールドでは、意味のある値が割り当てられている場合と、値が割り当てられていない場合を、区別することが必要なときがあります。 値型は、通常の値または 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 許容型を作成できません。 基になる型は、値型である必要があります。 詳細については、「 Value Types and Reference Types」を参照してください。
null 許容型変数の使用
null 許容値型の最も重要なメンバーは、HasValue プロパティと Value プロパティです。 null 許容値型の変数の場合、HasValue により、変数に定義済みの値が含まれているかどうかがわかります。 HasValue が True
の場合は、Value から値を読み取ることができます。 HasValue と Value はどちらも ReadOnly
プロパティであることに注意してください。
既定値
null 許容値型の変数を宣言すると、その HasValue プロパティには既定値の False
が設定されます。 これは、既定では、変数には、基になる値型の既定値が設定されるのではなく、定義された値がないことを意味します。 次の例では、Integer
型の既定値が 0 であっても、変数 numberOfChildren
の初期状態には定義された値がありません。
Dim numberOfChildren? As Integer
null 値は、未定義の値または不明な値を示すのに役立ちます。 numberOfChildren
が Integer
として宣言されている場合、情報が現在使用できないことを示す値は存在しません。
値の格納
null 許容値型の変数またはプロパティへの値の格納は、通常の方法で行います。 次の例では、前の例で宣言した numberOfChildren
変数に値を代入しています。
numberOfChildren = 2
null 許容値型の変数またはプロパティに定義された値が含まれている場合は、値が割り当てられていない初期状態に戻すことができます。 これを行うには、次の例に示すように、変数またはプロパティに Nothing
を設定します。
numberOfChildren = Nothing
Note
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 And b2 | b1 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
の場合は、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
Note
ショートサーキット評価を使用する 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 許容値型がサポートされているわけではありませんが、デザイナーで生成されたテーブル アダプターではサポートされています。 「TableAdapter での Null 許容型のサポート」を参照してください。
関連項目
.NET