null 許容値型 (Visual Basic)

特定の状況においては、定義された値を持たない値型を扱うことがあります。 たとえば、データベース内のフィールドには、意味のある値が代入されている場合と、値が代入されていない場合とがあり、これを区別する必要があります。 値型を拡張して、通常の値または null 値を受け入れるようにすることができます。 このような拡張は、null 許容型と呼ばれます。

各 null 許容型は、ジェネリックな Nullable 構造体から作成されます。 データベースを使って、仕事に関連する活動を記録すると仮定します。 次のコード例は、null 許容 Boolean データ型を作成し、この型の変数を宣言する方法を示しています。 宣言を記述するには 3 種類の方法があります。

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

変数 ridesBusToWork には、True または False の値を格納できるほか、まったく値が格納されない状態も許されます。 初期の既定値は、まったく値のない状態です。今回の例では、これはその人物についてまだ情報が取得されていないことを意味します。 これとは対照的に、False は、その人物に関する情報が取得され、仕事のバスに乗務していないことを示します。

null 許容型で変数やプロパティを宣言したり、null 許容型の要素で配列を宣言したりすることができます。 null 許容型をパラメーターとしてプロシージャを宣言することや、null 許容型を戻り値として Function プロシージャから返すこともできます。

null 許容型を配列、String、クラスなどの参照型で作成することはできません。 基になる型は、値型である必要があります。 詳細については、「値型と参照型」を参照してください。

null 許容型変数の使用

null 許容型の最も重要なメンバーは、HasValue プロパティと Value プロパティです。 null 許容型の変数に定義済みの値が格納されているかどうかは、HasValue を使って確認できます。 HasValue が True の場合、値を Value から読み取ることができます。 HasValueValue は両方とも ReadOnly のプロパティであることに注意してください。

既定値

null 許容型の変数を宣言すると、その変数の HasValue プロパティは、既定で False 値に設定されます。 つまり、既定では、変数は、基になる値型の既定値が格納されるのではなく、定義済みの値が格納されていない状態になります。 次のコード例では、Integer 型の既定値は 0 ですが、変数 numberOfChildren に定義済みの初期値は格納されません。

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 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

注意

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 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

データのある null 許容型の使用

データベースは、null 許容型が使用される最も重要な場所です。 現在すべてのデータベース オブジェクトで null 許容型がサポートされているわけではありませんが、デザイナー生成テーブル アダプターではサポートされています。 詳細については、「TableAdapter の概要」の「TableAdapter での Null 許容型のサポート」を参照してください。

参照

処理手順

データ型のトラブルシューティング (Visual Basic)

関連項目

Null 許容型の使用 (C# プログラミング ガイド)

InvalidOperationException

If 演算子 (Visual Basic)

Is 演算子 (Visual Basic)

IsNot 演算子 (Visual Basic)

HasValue

概念

Visual Basic におけるデータ型

値型と参照型

TableAdapter の概要

ローカル型の推論 (Visual Basic)