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 により、変数に定義済みの値が含まれているかどうかがわかります。 HasValueTrue の場合は、Value から値を読み取ることができます。 HasValueValue はどちらも ReadOnly プロパティであることに注意してください。

既定値

null 許容値型の変数を宣言すると、その HasValue プロパティには既定値の False が設定されます。 これは、既定では、変数には、基になる値型の既定値が設定されるのではなく、定義された値がないことを意味します。 次の例では、Integer 型の既定値が 0 であっても、変数 numberOfChildren の初期状態には定義された値がありません。

Dim numberOfChildren? As Integer

null 値は、未定義の値または不明な値を示すのに役立ちます。 numberOfChildrenInteger として宣言されている場合、情報が現在使用できないことを示す値は存在しません。

値の格納

null 許容値型の変数またはプロパティへの値の格納は、通常の方法で行います。 次の例では、前の例で宣言した numberOfChildren 変数に値を代入しています。

numberOfChildren = 2

null 許容値型の変数またはプロパティに定義された値が含まれている場合は、値が割り当てられていない初期状態に戻すことができます。 これを行うには、次の例に示すように、変数またはプロパティに Nothing を設定します。

numberOfChildren = Nothing

Note

null 許容値型の変数に Nothing を割り当てることはできますが、等号を使用して Nothing かどうかをテストすることはできません。 等号を使用する比較 (someVar = Nothing) は、常に Nothing と評価されます。 変数の HasValue プロパティが False かどうかをテストすることや、Is または IsNot 演算子を使用してテストすることはできます。

値の取得

null 許容値型の変数の値を取得するには、最初にその HasValue プロパティをテストして、値があることを確認する必要があります。 HasValueFalse のときに値を読み込もうとすると、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 変数をブール式で使用すると、結果は TrueFalse、または Nothing になります。 AndOr の真理値表を次に示します。 b1b2 が持つことのできる値は 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 b2Nothing と評価されます。 その結果、各 If ステートメントでは Else 句が実行され、出力は次のようになります。

Expression is not true

Expression is not false

Note

ショートサーキット評価を使用する AndAlso および OrElse では、最初が Nothing と評価されたときに、2 番目のオペランドを評価する必要があります。

伝達

算術、比較、シフト、または型の演算の一方または両方のオペランドが null 許容値型である場合は、演算の結果も null 許容値型になります。 両方のオペランドの値が Nothing ではない場合、演算は、どちらも null 許容値型でない場合と同じように、オペランドの基になる値に対して実行されます。 次の例では、変数 compare1sum1 は暗黙的に型指定されています。 これらをマウスでポイントすると、どちらもコンパイラによって 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 許容型のサポート」を参照してください。

関連項目