使用普通声明语句声明对象变量。 对于数据类型,可以指定 Object
(即 对象数据类型)或要从中创建对象的更具体的类。
将变量声明为 Object
与声明变量 System.Object相同。
使用特定对象类声明变量时,它可以访问该类公开的所有方法和属性,以及从中继承的类。 如果使用 `Object` 声明变量,它只能访问 `Object` 类的成员,除非你转换 `Option Strict Off
` 以允许动态绑定。
声明语法
使用以下语法声明对象变量:
Dim variablename As [New] { objectclass | Object }
还可以在声明中指定 Public、 Protected、 Friend、 Protected Friend
、 Private、 Shared 或 Static 。 以下示例声明有效:
Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem
后期绑定和早期绑定
有时,在代码运行之前,特定类未知。 在这种情况下,您必须将对象变量声明为 Object
数据类型。 这会创建对任何类型的对象的常规引用,并在运行时分配特定类。 这种情况被称为后期绑定。 后期绑定需要额外的执行时间。 它还会将代码限制在最近分配给它的类的方法和属性上。 如果代码尝试访问其他类的成员,这可能会导致运行时错误。
在编译时知道特定类时,应将对象变量声明为该类。 这称为 早期绑定。 早期绑定可提高性能,并保证代码访问特定类的所有方法和属性。 在前面的示例声明中,如果变量 objA
只使用类 System.Windows.Forms.Label的对象,则应在其声明中指定 As System.Windows.Forms.Label
。
早期绑定的优点
将对象变量声明为特定类具有以下优点:
自动类型检查
保证能够访问特定类的所有成员
代码编辑器中的 Microsoft IntelliSense 支持
改进了代码的可读性
代码中的错误更少
在编译时捕获的错误,而不是运行时捕获的错误
更快的代码执行
访问对象变量成员
当 Option Strict
设置为 On
时,对象变量仅可访问声明它所用的类的方法和属性。 下面的示例对此进行了演示。
' Option statements must precede all other source file lines.
Option Strict On
' Imports statement must precede all declarations in the source file.
Imports System.Windows.Forms
Public Sub accessMembers()
Dim p As Object
Dim q As System.Windows.Forms.Label
p = New System.Windows.Forms.Label
q = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler ERROR.
j = p.Left
' The following statement retrieves the left edge of the label in pixels.
k = q.Left
End Sub
在此示例中,p
只能使用不包含Object该属性的Left
类本身的成员。 另一方面,q
被声明为类型 Label,因此它可以使用 Label 命名空间中 System.Windows.Forms 类的所有方法和属性。
对象变量的灵活性
在继承层次结构中使用对象时,可以选择用于声明对象变量的类。 在做出此选择时,您必须在对象分配的灵活性与对类成员的访问之间进行权衡。 例如,考虑通向System.Windows.Forms.Form 类的继承层次结构:
假设你的应用程序定义了一个称为 specialForm
的窗体类,该类继承自 Form 类。 你可以声明一个专门引用specialForm
的对象变量,如以下示例所示。
Public Class specialForm
Inherits System.Windows.Forms.Form
' Insert code defining methods and properties of specialForm.
End Class
Dim nextForm As New specialForm
前面的示例中的声明将变量 nextForm
限制为类 specialForm
的对象,但也使所有方法和属性 specialForm
都 nextForm
可供使用,以及继承自 specialForm
的所有类的所有成员。
可以通过将对象变量声明为类型 Form使对象变量更通用,如以下示例所示。
Dim anyForm As System.Windows.Forms.Form
通过上述示例中的声明,您可以将应用程序中的任何窗体分配给anyForm
。 但是,虽然 anyForm
可以访问类 Form的所有成员,但它不能使用为特定窗体定义的任何其他方法或属性,例如 specialForm
。
基类的所有成员都可用于派生类,但派生类的附加成员对基类不可用。