对象变量声明 (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 类的继承层次结构:

Object

  MarshalByRefObject

    Component

      Control

        ScrollableControl

          ContainerControl

            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)定义的任何其他方法或属性。

基类的所有成员均可用于派生类,但派生类的其他成员对基类不可用。

另请参阅