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 のオブジェクトとは異なります。