Visual Basic 6.0 使用者可用的參數傳遞機制
更新:2007 年 11 月
Visual Basic 2008 包含了多項變更,這些變更會影響引數傳遞至程序的方式。
預設傳遞機制
Visual Basic 6.0
在 Visual Basic 6.0 中,如果您不為程序參數指定 ByVal 或 ByRef,傳遞機制會預設值為 ByRef。這可讓被傳入程序的變數在呼叫程式中被修改。
將變數公開在修改狀態可能造成意外的狀況。在以下範例中,傳遞機制會預設值為 ByRef、minutesPastHour 會改變 elapsedSeconds 的值,而 MsgBox 會錯誤地顯示 elapsedSeconds。
Function minutesPastHour(seconds As Integer) As Integer
Dim hours As Integer = seconds \ 3600
seconds = seconds Mod 3600
Return seconds \ 60
End Function
Sub showSecondsAndMinutes()
Dim elapsedSeconds, extraMinutes As Integer
elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight.
extraMinutes = minutesPastHour(elapsedSeconds)
MsgBox "Total seconds: " & elapsedSeconds & _
"; minutes past hour: " & extraMinutes
End Sub
傳遞 ByRef 引數會讓程序在呼叫程式中變更它,這樣可能會造成未預期的行為。而且如果該程序呼叫另一個程序並傳遞相同的 ByRef 引數,則不小心變更原始變數的機會會增加。
Visual Basic 2008
當您在 Visual Basic 2008 宣告程序時,每一個參數的預設傳遞機制都是 ByVal。這會保護引數免於被修改。以上範例中的宣告可重寫如下。
Function MinutesPastHour(ByVal Seconds As Integer) As Integer
以傳值 (By Value) 方式來傳遞 seconds 可防止程序存取呼叫程式中的變數,而且有助於避免前述的意外狀況。
雖然 ByVal 是預設機制,但如果您為每個參數明確指定它,便可移除不確定性並讓他人更容易閱讀您的程式碼。
ByRef 屬性引數
Visual Basic 6.0
在 Visual Basic 6.0 中,被當做 ByRef 引數來傳遞至程序的屬性 (Property) 會被複製到程序中,但不會被複製出來。這表示在呼叫程式中,對此種屬性 (Property) 引數的修改並不會反映回原始屬性 (Property),就算它是以 ByRef 方式傳遞的也一樣。
Visual Basic 2008
在 Visual Basic 2008 中,以 ByRef 方式傳遞的屬性引數會同時複製至程序內外。下列範例會示範如何由程序來變更屬性。
Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ... ' Code to modify Height argument.
End Sub
Dim Sq As Square = New Square ' Square has property Side of type Single.
Reduce(Sq.Side) ' Side is changed when Reduce returns.
當程序修改屬性 (Property) 引數時,呼叫程式中的原始屬性 (Property) 值並不會立即變更,而是在程序傳回時才被複製出來。
ParamArray 引數
Visual Basic 6.0
在 Visual Basic 6.0 中,程序可以在它的最後一個引數上指定 ParamArray 關鍵字以接受 Variant 引數的陣列。您無法宣告這些引數的傳遞機制。它們永遠會以 ByRef 方式傳遞。
Visual Basic 2008
在 Visual Basic 2008 中,ParamArray 引數一律是以 ByVal 方式傳遞。陣列中的引數必須全部是 ParamArray 引數的資料型別。