如何:變更程序引數的值 (Visual Basic)
當您呼叫程序時,您提供的每個引數都會對應至程序中定義的其中一個參數。 在某些情況下,程序程式碼可以變更呼叫程式碼中引數的基礎值。 在其他情況下,程序只能變更其引數的本機複本。
當您呼叫程序時,Visual Basic 會為每個傳遞 ByVal 的引數建立本機複本。 針對傳遞 ByRef 的每個引數,Visual Basic 會為程序程式碼提供呼叫程式碼中引數基礎的程式設計元件直接參考。
如果呼叫程式碼中的基礎元素是可修改元素,而且引數會傳遞 ByRef
,則程序程式碼可以使用直接參考來變更呼叫程式碼中的元素值。
變更基礎值
變更呼叫程式碼中程序引數的基礎值
在程序宣告中,為對應引數的參數指定 ByRef。
在呼叫程式碼中,傳遞可修改的程式設計元素作為引數。
在呼叫程式碼中,請勿在引數清單中以括弧括住引數。
在程序程式碼中,使用參數名稱將值指派給呼叫程式碼中的基礎元素。
如需示範,請參閱下方的範例。
變更本機複本
如果呼叫程式碼中的基礎元素是不可修改的元素,或傳遞引數 ByVal
,則程序無法在呼叫程式碼中變更其值。 不過,程序可以變更其這類引數的本機複本。
若要變更程序程式碼中程序引數的複本
在程序宣告中,為對應引數的參數指定 ByVal。
-或-
在呼叫程式碼中,將引數括在引數清單中的括弧。 這會強制 Visual Basic 以傳值方式傳遞引數,即使對應的參數指定
ByRef
。在程序程式碼中,使用參數名稱將值指派給引數的本機複本。 呼叫程式碼中的基礎值不會變更。
範例
下列範例顯示採用陣列變數並對其元素操作的兩個程序。 程序 increase
只會將一個陣列新增至每個元素。 程序 replace
會將新的陣列指派給參數 a()
,然後將一個陣列新增至每個元素。
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByRef a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
第一個 MsgBox
呼叫會顯示「增加 (n) 之後:11、21、31、41」。 因為陣列 n
是參考型別,所以即使傳遞機制是 ByVal
,replace
也可以變更其成員。
第二個 MsgBox
呼叫會顯示「取代 (n) 之後:101、201、301」。 因為 n
已傳遞 ByRef
,所以 replace
可以修改呼叫程式碼中的變數 n
,並對其指派新的陣列。 因為 n
是參考型別,所以 replace
也可以變更其成員。
您可以防止程序修改呼叫程式碼中的變數本身。 請參閱如何:防止程序引數的值變更。
編譯程式碼
當您以參考方式傳遞變數時,必須使用 ByRef
關鍵字來指定此機制。
Visual Basic 中的預設值是以傳值方式傳遞引數。 不過,使用每個宣告的參數來包含 ByVal 或 ByRef 關鍵字是很好的程式設計作法。 這可讓您的程式碼更容易閱讀。
.NET Framework 安全性
允許程序變更呼叫程式碼中引數的基礎值時,一向會有潛在風險。 請確定您預期此值會變更,並準備好在使用該值之前檢查其是否有效。