物件變數宣告 (Visual Basic)
您可以使用一般宣告陳述式來宣告物件變數。 針對資料類型,您可以指定 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
的所有方法和屬性,以及 specialForm
繼承之所有來源類別中的所有成員,都可供 nextForm
使用。
您可以將物件變數宣告為 Form 類型,使物件變數更一般,如下列範例所示。
Dim anyForm As System.Windows.Forms.Form
上述範例中的宣告可讓您將應用程式中的任何表單指派給 anyForm
。 不過,雖然 anyForm
可以存取 Form 類別的所有成員,但無法使用針對特定表單 (例如 specialForm
) 所定義的任何其他方法或屬性。
基底類別的所有成員都可供衍生類別使用,但衍生類別的其他成員無法供基底類別使用。