次の方法で共有


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 許容型を構築することはできません。 基になる型は値型である必要があります。 詳細については、「 値の型と参照型」を参照してください

Null 許容型変数の使用

null 許容値型の最も重要なメンバーは、その HasValue プロパティと Value プロパティです。 null 許容値型の変数の場合、 HasValue は変数に定義済みの値が含まれているかどうかを示します。 HasValueTrueされている場合は、Valueから値を読み取ることができます。 HasValueValueの両方が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 プロパティをテストして、値があることを確認する必要があります。 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 および 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 b2Nothingに評価されます。 その結果、各 If ステートメントで Else 句が実行され、出力は次のようになります。

Expression is not true

Expression is not false

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 許容値型をサポートしているわけではありませんが、デザイナーによって生成されたテーブル アダプターではサポートされます。 null 許容型の TableAdapter のサポートを参照してください。

こちらも参照ください