程式宣告會決定傳遞機制。 如果參數被宣告為 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 安全性
允許程式變更呼叫程式代碼中自變數的基礎值時,一律會有潛在的風險。 請確定您預期此值會變更,並準備好在使用它之前檢查其有效性。