Nothing 关键字 (Visual Basic)

表示任意数据类型的默认值。 对于引用类型,默认值是 null 引用。 对于值类型,默认值取决于值类型是否可为空。

注意

对于不可为 null 的值类型,Visual Basic 中的 Nothing 与 C# 中的 null 不同。 在 Visual Basic 中,如果将不可为 null 的值类型的变量设置为 Nothing,则变量将设置为其声明类型的默认值。 在 C# 中,如果将不可为 null 的值类型的变量分配给 null,则会发生编译时错误。

注解

Nothing 表示数据类型的默认值。 默认值取决于变量是值类型还是引用类型。

值类型的变量直接包含其值。 值类型包括所有数值数据类型、BooleanCharDate、所有结构和所有枚举。 引用类型的变量将对象实例的引用存储在内存中。 引用类型包含类、数组、委托和字符串。 有关更多信息,请参见 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 NothingIsNot Nothing。 不要使用 = Nothing<> Nothing

对于 Visual Basic 中的字符串,空字符串等于 Nothing。 因此,"" = Nothing 为 true。 这一事实使得在处理字符串时选择正确的比较尤其重要。 虽然 myString = NothingmyString <> Nothing 指示是否设置了非空值,但我们强烈建议为此目的使用 String.IsNullOrEmpty(myString)。 使用 Is NothingIsNot Nothing 确定是否设置了任何值(包括空字符串)。

以下示例演示使用 IsIsNot 运算符的比较:

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 对象,后者表示未初始化的变体或不存在的数据库列。

另请参阅