Nothing (Visual Basic)

任意のデータ型の既定値を表します。参照型の場合既定値は null の参照です。値型の場合既定値が値型が許容であるかによって異なります。

[!メモ]

null 非許容値型ではVisual Basic の Nothing はC# の null とは異なります。Visual Basic ではNothing にnull 非許容値型の変数を設定した場合その変数は宣言型の既定値に設定されます。C# ではnull にnull 非許容値型の変数を割り当てコンパイル時のエラーが発生します。

解説

Nothing はデータ型の既定値を表します。既定値は変数が値型か参照型かによって異なります。

値型の 変数は値を直接含みます。値型はすべての数値型BooleanCharDateすべてのすべての構造体と列挙体が含まれています。 参照型 の変数をメモリ内でオブジェクトのインスタンスへの参照を格納します。参照型はクラス配列デリゲート文字列が含まれます。詳細については、「値型と参照型」を参照してください。

変数が値型の場合Nothing の動作は変数を null 許容のデータ型であるかによって異なります。null 許容値型を表すには型名に ? の修飾子を追加します。null 許容型の変数へ Nothing を割り当てる null に値を設定します。使用例を含む詳細については、「null 許容値型 (Visual Basic)」を参照してください。

変数が許容ではない値型の場合はそれを Nothing を割り当てる宣言型の既定値に設定します。型に変数のメンバーが含まれている場合は、すべてに既定値が設定されます。次にスカラー型の場合の例を示します。

Module Module1

    Sub Main()
        Dim ts As TestStruct
        Dim i As Integer
        Dim b As Boolean

        ' The following statement sets ts.Name to Nothing and ts.Number to 0.
        ts = Nothing

        ' The following statements set i to 0 and b to False.
        i = Nothing
        b = Nothing

        Console.WriteLine("ts.Name: " & ts.Name)
        Console.WriteLine("ts.Number: " & ts.Number)
        Console.WriteLine("i: " & i)
        Console.WriteLine("b: " & b)

        Console.ReadKey()
    End Sub

    Public Structure TestStruct
        Public Name As String
        Public Number As Integer
    End Structure
End Module

変数が参照型の場合Nothing に変数の型の null の参照に変数の設定に割り当てられます。null の参照に設定した変数はオブジェクトに関連付けられません。次に例を示します。

Module Module1

    Sub Main()

        Dim testObject As Object
        ' The following statement sets testObject so that it does not refer to
        ' any instance.
        testObject = Nothing

        Dim tc As New TestClass
        tc = Nothing
        ' The fields of tc cannot be accessed. The following statement causes 
        ' a NullReferenceException at run time. (Compare to the assignment of
        ' Nothing to structure ts in the previous example.)
        'Console.WriteLine(tc.Field1)

    End Sub

    Class TestClass
        Public Field1 As Integer
        ' . . .
    End Class
End Module

null 許容値型または参照 () 変数が null かどうかを確認する場合は= Nothing または <> Nothing を使用しないでください。Is Nothing または IsNot Nothing を使用します。

Visual Basic で文字列の場合は空の文字列が Nothing になります。したがって"" = Nothing は TRUE です。

Is 演算子と IsNot 演算子を使用した比較の例を次に示します。

Module Module1
    Sub Main()

        Dim testObject As Object
        testObject = Nothing
        Console.WriteLine(testObject Is Nothing)
        ' Output: True

        Dim tc As New TestClass
        tc = Nothing
        Console.WriteLine(tc IsNot Nothing)
        ' Output: False

        ' Declare a nullable value type.
        Dim n? As Integer
        Console.WriteLine(n Is Nothing)
        ' Output: True

        n = 4
        Console.WriteLine(n Is Nothing)
        ' Output: False

        n = Nothing
        Console.WriteLine(n IsNot Nothing)
        ' Output: False

        Console.ReadKey()
    End Sub

    Class TestClass
        Public Field1 As Integer
        Private field2 As Boolean
    End Class
End Module

As 句を使用しないで変数を宣言し、それを Nothing に設定した場合、その変数の型は Object になります。次に例を示します: Dim something = Nothingコンパイル時のエラーが Option Strict が有効でOption Infer がオフの場合この場合です。

キーワード Nothing をオブジェクト変数に代入すると、その変数はどのオブジェクト インスタンスも参照しなくなります。それまで変数がインスタンスを参照していた場合は、変数に Nothing を設定しても、インスタンス自体が終了することはありません。インスタンスが終了したとき、関連付けられていたメモリとシステム リソースが解放されるのは、アクティブな参照が残っていないことをガベージ コレクター (GC: Garbage Collector) が検出した後だけです。

Nothing は初期化せずバリアントか存在しないデータベース列を表す DBNull のオブジェクトとは異なります。

参照

関連項目

Dim ステートメント (Visual Basic)

Is 演算子 (Visual Basic)

IsNot 演算子 (Visual Basic)

概念

オブジェクトの有効期間: オブジェクトの作成と破棄 (Visual Basic)

Visual Basic における有効期間

null 許容値型 (Visual Basic)