HOW TO:強制以傳值方式傳遞引數
更新:2007 年 11 月
程序宣告可決定傳遞機制。如果是以 ByRef 方式宣告參數,則 Visual Basic 會預期以傳址 (By Reference) 方式傳遞對應的引數。這允許程序變更呼叫程式碼中,對應到引數的程式設計項目值。如果您不想讓對應的項目產生變更,則可使用括號將引數名稱括起來,即能覆寫程序呼叫中的 ByRef 傳遞機制。這些括號不包括在呼叫中用於引數清單的括號。
呼叫程式碼無法覆寫 ByVal 機制。
若要強制以傳值方式傳遞引數
如果程序中是以 ByVal 宣告對應的參數,則不需採取任何其他步驟。Visual Basic 也會預期以傳值方式傳遞該引數。
如果程序中是以 ByRef 宣告對應的參數,請在程序呼叫中用括號將引數括起來。
範例
下列範例會覆寫 ByRef 參數宣告。在強制 ByVal 的呼叫中,請注意兩種層次的括號。
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
在將引數清單內的 str 以額外括號括起來時,setNewString 程序無法變更它在呼叫程式碼中的值,而 MsgBox 會顯示「如果以 ByVal 方式傳遞,則無法取代」。若未以額外的括號將 str 括起來,則程序即可變更它,且 MsgBox 會顯示「這是新的 inString 引數值」。
編譯程式碼
當您以傳址方式來傳遞變數時,您必須用 ByRef 關鍵字指定這個機制。
Visual Basic 中的預設值是以值來傳遞引數。但是,在每一個宣告的參數中包括 ByVal 或 ByRef 關鍵字是很好的程式設計方式。這樣會讓您的程式碼更容易閱讀。
穩固程式設計
如果程序以 ByRef 宣告參數,則程式碼的正確執行可能會根據是否可在呼叫程式碼中變更對應的項目而定。如果呼叫程式碼是藉由將引數括在括號中來覆寫這個呼叫機制,或者傳遞的是不可修改的引數,則程序無法變更對應的項目。這可能會在呼叫程式碼中產生未預期的結果。
安全性
允許程序在呼叫程式碼中變更引數對應的值,一定會有潛在風險。請確定您預期會變更這個值,並在使用它之前,準備好檢查它的有效性。