Share via


升級建議:解析無參數的預設屬性

更新:2007 年 11 月

在 Visual Basic 6.0 中,許多物件都有可以公開可省略為程式設計捷徑的預設屬性 (Property)。例如,TextBox 有個預設屬性為 Text,所以不必寫成:

MsgBox Form1.Text1.Text

您可以使用捷徑:

MsgBox Form1.Text1

程式碼編譯時將解析預設的屬性。此外,您也可以在晚期繫結 (Late Bound) 物件使用預設屬性,如以下範例所示:

Dim obj As Object
Set obj = Form1.Text1
MsgBox obj

在晚期繫結範例中,預設屬性將在執行階段進行解析,且 MsgBox 會顯示 TextBox 的預設屬性值 Text1。

Visual Basic 2008 不支援無參數預設屬性,因此也不允許這種程式設計捷徑。專案升級時,Visual Basic 2008 會解析無參數的預設屬性,但是依賴執行階段解析的晚期繫結用法就無法被自動解析。在這種情況下,您將需要自行修改程式碼。其他複雜性是許多程式庫使用稱為 _Default 的屬性,實作預設屬性。_Default 會做為 Proxy,將呼叫傳遞至實際預設屬性。因此,在專案升級後,某些預設屬性將解析為 _Default。您的程式碼還是可以如往常般運作,但是將比使用真實屬性的程式碼不容易了解。基於這些原因,請避免在您的 Visual Basic 6.0 程式碼中使用無參數預設屬性。不要寫成:

Dim obj As Object
Set obj = Me.Text1
'BAD: Relying on default property
MsgBox obj
'BAD: Relying on default property
MsgBox Me.Text1

使用:

Dim obj As TextBox
Set obj = Me.Text1
'GOOD: Default property is resolved
MsgBox obj.Text
'GOOD: Default property is resolved
MsgBox Me.Text1.Text

Visual Basic 2008 不支援無參數的預設屬性,但支援具有參數的預設屬性。若要了解這兩者之間的差異,請考慮有參數的預設屬性都一定具有索引。其中一個範例是 ADO recordset 的預設屬性:Fields 集合。程式碼:

Dim rs As ADODB.Recordset
rs("CompanyName") = "SomeCompany"
rs!CompanyName = "SomeCompany"

事實上是下列程式碼的捷徑:

Dim rs As ADODB.Recordset
rs.Fields("CompanyName").Value = "SomeCompany"
rs.Fields!CompanyName.Value = "SomeCompany"

在這種情況下,Fields 屬性是參數型,因此這種用法在 Visual Basic 2008 中是有效的。但是,Fields 屬性的預設屬性 Value 是無參數的,因此在 Visual Basic 2008 中的正確用法為:

Dim rs As ADODB.Recordset
rs("CompanyName").Value = "SomeCompany"
rs!CompanyName.Value = "SomeCompany"

專案升級時,這個例子和大多數其他預設屬性都會被解析,因此在 Visual Basic 6.0 中解析它們只是一種良好的程式設計方式。但是,您應該避免使用 Object 和 Variant 資料型別的預設屬性 (Property),因為它們無法被解析,您將必須在升級後的專案中自行修正程式碼。

請參閱

其他資源

語言升級的建議