任意のデータ型の既定値を表します。 参照型の場合、既定値は null 参照です。 値型の場合、既定値は値型が null 許容かどうかによって異なります。
注
null 非許容値型の場合、Visual Basic の Nothing は C# の null とは異なります。 Visual Basic では、null 非許容値型の変数を Nothingに設定すると、変数は宣言された型の既定値に設定されます。 C# では、null 非許容値型の変数を nullに割り当てると、コンパイル時エラーが発生します。
注釈
Nothing は、データ型の既定値を表します。 既定値は、変数が値型か参照型かによって異なります。
値型の変数には、その値が直接含まれています。 値型には、すべての数値データ型、 Boolean、 Char、 Date、すべての構造体、およびすべての列挙型が含まれます。
参照型の変数は、オブジェクトのインスタンスへの参照をメモリに格納します。 参照型には、クラス、配列、デリゲート、および文字列が含まれます。 詳細については、「 値の型と参照型」を参照してください。
変数が値型の場合、 Nothing の動作は、変数が null 許容データ型であるかどうかによって異なります。 null 許容値型を表すには、型名に ? 修飾子を追加します。 null 許容変数に Nothing を割り当てると、値が nullに設定されます。 詳細と例については、「 Null 許容値型」を参照してください。
変数が null 許容でない値型の場合、変数に Nothing を割り当てると、宣言された型の既定値に設定されます。 その型に変数メンバーが含まれている場合、それらはすべて既定値に設定されます。 スカラー型の例を次に示します。
Module Module1
Sub Main()
Dim ts As TestStruct
Dim i As Integer
Dim b As Boolean
' The following statement sets ts.Name to null 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されているかどうかを確認するには、常に Is Nothing または IsNot Nothingを使用します。
= Nothing も <> Nothing も使用しないでください。
Visual Basic の文字列の場合、空の文字列は Nothingと等しくなります。 したがって、 "" = Nothing は true です。 このため、文字列を操作するときに正しい比較を選択することが特に重要になります。
myString = NothingとmyString <> Nothingは空でない値が設定されているかどうかを示しますが、この目的にはString.IsNullOrEmpty(myString)を使用することを強くお勧めします。
Is NothingとIsNot Nothingを使用して、空の文字列を含む任意の値が設定されたかどうかを判断します。
次の例は、 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) がアクティブな参照が残っていないと検出された後だけです。
Nothing は、初期化されていないバリアントまたは存在しないデータベース列を表す DBNull オブジェクトとは異なります。
こちらも参照ください
.NET