您可以使用一般宣告語句來宣告物件變數。 針對數據類型,您可以指定 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 資料類型來宣告物件變數。 這會建立對任何類型物件的一般參考,並在執行時期指派特定類別。 這稱為 晚期系結。 延遲繫結需要額外的執行時間。 它也會將您的程式代碼限制在您最近指派給它的類別的方法和屬性上。 如果您的程式代碼嘗試存取不同類別的成員,這可能會導致運行時錯誤。
當您在編譯階段知道特定類別時,應該將物件變數宣告為該類別。 這稱為 早期系結。 早期系結可改善效能,並保證程式代碼可存取特定類別的所有方法和屬性。 在上述範例宣告中,如果 variable 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。
基類的所有成員都可供衍生類別使用,但衍生類別的其他成員則無法使用基類。