共用方式為


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 中的預設值是以值來傳遞引數。但是,在每一個宣告的參數中包括 ByValByRef 關鍵字是很好的程式設計方式。這樣會讓您的程式碼更容易閱讀。

請參閱

工作

HOW TO:將引數傳遞至程序

HOW TO:變更程序引數的值

HOW TO:強制以傳值方式傳遞引數

概念

Visual Basic 中的程序

程序參數和引數

以傳值和傳址方式傳遞引數

可修改引數和不可修改引數之間的差異

以傳值或傳址方式傳遞引數的差別

依位置和名稱傳遞引數

實值型別和參考型別