对象变量声明 (Visual Basic)
使用常规声明语句声明对象变量。 对于数据类型,指定 Object
(即对象数据类型)或要从中创建对象的更具体的类。
将变量声明为 Object
与将其声明为 System.Object 相同。
当使用特定的对象类声明变量时,它可以访问由此类及其从中继承的类公开的所有方法和属性。 如果使用 Object 声明变量,则它只能访问 Object 类的成员,除非将 Option Strict Off
改为允许后期绑定。
声明语法
使用以下语法声明对象变量:
Dim variablename As [New] { objectclass | Object }
你还可以在声明中指定公开、受保护、友好、Protected Friend
、专用、共享或静态。 下面的示例声明是有效的:
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
)定义的任何其他方法或属性。
基类的所有成员均可用于派生类,但派生类的其他成员对基类不可用。