HOW TO:防止程序引數的值變更
更新:2007 年 11 月
如果程序將參數宣告成 ByRef,Visual Basic 就能讓程序程式碼直接參考程式設計項目 (呼叫程式碼中的基礎引數)。這能讓程序變更呼叫程式碼中引數的基礎值。在某些情況下,呼叫程式碼可能想防止這類變更。
您永遠都可以在程序中宣告對應參數 ByVal 來防止變更引數。如果想要在某些情況下變更指定的引數,其他情況下防止變更,則可將它宣告為 ByRef,並讓呼叫程式碼決定每一個呼叫的傳遞機制。它會將對應引數以括號括住,依值來傳遞它,或不以括號括住,依參考來傳遞它,以完成這個動作。如需詳細資訊,請參閱 HOW TO:強制以傳值方式傳遞引數。
範例
下列範例會顯示兩個取得陣列變數,並在其元素上作業的程序。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(ByVal 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 呼叫顯示 "After increase(n): 11, 21, 31, 41"。因為陣列 n 是參考型別,所以 replace 可變更其成員,即使傳遞機制是 ByVal 也一樣。
第二個 MsgBox 呼叫顯示 "After replace(n): 11, 21, 31, 41"。由於 n 傳遞 ByVal,所以 replace 無法藉由將新陣列指派給呼叫程式碼中的變數 n 來修改該變數。當 replace 建立新陣列執行個體 k ,並且將它指派給區域變數 a 時,會遺失呼叫程式碼所傳入之 n 的參考。當它變更 a 的成員時,只會影響區域陣列 k 。因此, replace 不會增加呼叫程式碼中陣列 n 的值。
編譯程式碼
Visual Basic 中的預設值是以值來傳遞引數。但是,在每一個宣告的參數中包括 ByVal 或 ByRef 關鍵字是很好的程式設計方式。這樣會讓您的程式碼更容易閱讀。