如何:強制以傳值方式傳遞引數 (Visual Basic)
程序宣告會決定傳遞機制。 如果參數宣告 ByRef,Visual Basic 預期會以傳址方式傳遞對應的引數。 這可讓程序變更呼叫程式碼中引數基礎的程式設計元素值。 如果您想要保護基礎元素免於這類變更,您可以用括號括住引數名稱,覆寫程序呼叫中的 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,則程式碼的正確執行可能取決於是否能夠在呼叫程式碼中變更基礎元素。 如果呼叫程式碼透過以括號括住引數來覆寫此呼叫機制,或者如果傳遞不可修改的引數,程序就無法變更基礎元素。 這可能會在呼叫程式碼中產生非預期的結果。
.NET Framework 安全性
允許程序變更呼叫程式碼中引數的基礎值時,一向會有潛在風險。 請確定您預期此值會變更,並準備好在使用該值之前檢查其是否有效。