HOW TO:在 Visual Basic 中宣告及呼叫預設屬性
「預設屬性」(Default Property) 是程式碼可存取但不需指定的類別或結構屬性。 在呼叫程式碼命名類別或結構 (而非屬性),且內容允許存取屬性時,Visual Basic 會解析該類別或結構預設屬性 (如果有的話) 的存取權。
類別或結構最多可有一個預設屬性。 不過,您可多載預設屬性,且擁有一個以上的屬性版本。
如需詳細資訊,請參閱Default (Visual Basic)。
若要宣告預設屬性
以一般方式宣告屬性, 不要指定 Shared 或 Private 關鍵字。
在屬性宣告中包含 Default 關鍵字。
至少為屬性指定一個參數, 無法定義未包含任何引數的預設屬性。
Default Property myProperty(ByVal index As Integer) As String
若要呼叫預設屬性
宣告包含類別或結構型別 (Structure Type) 的變數。
Dim x As New class1(3)
在您通常會包含屬性名稱的運算式中,單獨使用變數名稱。
MsgBox(x)
變數名稱後面緊跟著以括號括住的引數清單, 預設屬性至少必須取用一個引數。
MsgBox(x(1))
若要擷取預設屬性值,請在運算式中使用變數名稱 (含引數清單),或在指派陳述式 (Assignment Statement) 的等號 (=) 後面使用變數名稱。
MsgBox(x(1) & x(2) & x(3))
若要設定預設屬性值,請在指派陳述式的左邊使用變數名稱 (含引數清單)。
x(1) = "Hello" x(2) = " " x(3) = "World"
您永遠可同時指定預設屬性名稱與變數名稱,就像存取任何其他屬性一樣。
x.myProperty(1) = "Hello" x.myProperty(2) = " " x.myProperty(3) = "World"
範例
以下範例會在類別上宣告預設屬性:
Public Class class1
Private myStrings() As String
Sub New(ByVal size As Integer)
ReDim myStrings(size)
End Sub
Default Property myProperty(ByVal index As Integer) As String
Get
' The Get property procedure is called when the value
' of the property is retrieved.
Return myStrings(index)
End Get
Set(ByVal Value As String)
' The Set property procedure is called when the value
' of the property is modified.
' The value to be assigned is passed in the argument
' to Set.
myStrings(index) = Value
End Set
End Property
End Class
這個程式碼範例也可做為 IntelliSense 程式碼片段。 在程式碼片段選擇器中,這個程式碼片段位於 [Visual Basic 語言] 中。 如需詳細資訊,請參閱 HOW TO:插入 IntelliSense 程式碼片段。
下列範例會示範如何在類別 class1 上呼叫預設屬性 myProperty。 這三個指派陳述式會將值儲存在 myProperty 中,而 MsgBox 呼叫會讀取這些值。
Sub Test()
Dim x As New class1(3)
x(1) = "Hello"
x(2) = " "
x(3) = "World"
MsgBox(x(1) & x(2) & x(3))
End Sub
預設屬性的最常見用法是各種集合類別 (Collection Class) 上的 Item 屬性。
穩固程式設計
預設屬性可小幅度地減少原始程式碼字元,但會讓其他人更不容易看懂您的程式碼。 如果呼叫程式碼不熟悉您的類別或結構,則在它產生該類別或結構名稱的參考時,會無法確定該參考存取的是類別或結構本身或預設屬性。 這會造成編譯器錯誤,或微妙的執行階段邏輯錯誤。
您永遠可以使用 Option Strict 陳述式,將編譯器型別檢查 (Type Checking) 設為 On,以減少預設屬性錯誤的機會。
如果您預計在程式碼中使用預先定義的類別或結構,則必須判斷它是否具有預設屬性,如果有則其名稱為何。
因為這些缺點,所以您應考慮不要定義預設屬性。 為了增加程式碼可讀性,也應考慮一律明確參考所有屬性 (甚至是預設屬性)。
請參閱
工作
HOW TO:宣告混合存取層級的屬性 (Visual Basic)