Nothing 关键字 (Visual Basic)
表示任意数据类型的默认值。 对于引用类型,默认值是 null
引用。 对于值类型,默认值取决于值类型是否可为空。
注意
对于不可为 null 的值类型,Visual Basic 中的 Nothing
与 C# 中的 null
不同。 在 Visual Basic 中,如果将不可为 null 的值类型的变量设置为 Nothing
,则变量将设置为其声明类型的默认值。 在 C# 中,如果将不可为 null 的值类型的变量分配给 null
,则会发生编译时错误。
注解
Nothing
表示数据类型的默认值。 默认值取决于变量是值类型还是引用类型。
值类型的变量直接包含其值。 值类型包括所有数值数据类型、Boolean
、Char
、Date
、所有结构和所有枚举。 引用类型的变量将对象实例的引用存储在内存中。 引用类型包含类、数组、委托和字符串。 有关更多信息,请参见 Value Types and Reference Types。
如果变量是值类型,则 Nothing
的行为取决于变量是否是可为空数据类型。 若要表示可为空的值类型,请向类型名称添加 ?
修饰符。 将 Nothing
分配给可为空的变量会将值设置为 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 对象,后者表示未初始化的变体或不存在的数据库列。