null 許容値型
更新 : 2007 年 11 月
特定の状況においては、定義された値を持たない値型を扱うことがあります。たとえば、データベース内のフィールドには、意味のある値が代入されている場合と、値が代入されていない場合とがあり、これを区別する必要があります。値型を拡張して、通常の値または 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 許容型をパラメータとしてプロシージャを宣言することや、null 許容型を戻り値として Function プロシージャから返すこともできます。
null 許容型を配列、String、クラスなどの参照型で作成することはできません。基になる型は、値型である必要があります。詳細については、「値型と参照型」を参照してください。
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
メモ : |
---|
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 許容型のサポート」を参照してください。