如何:防止程序引數的值變更 (Visual Basic)

如果程序宣告參數為 ByRef,Visual Basic 會為程序程式碼提供呼叫程式碼中引數基礎的程式設計元素直接參考。 這可讓程式變更呼叫程式碼中引數的基礎值。 在某些情況下,呼叫程式碼可能會想要防止如此變更。

您一律可以藉由在程序中宣告對應的參數 ByVal,來防止引數變更。 如果您希望在某些情況下能夠只變更指定的引數,可以宣告該引數 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(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 呼叫會顯示「增加 (n) 之後:11、21、31、41」。 因為陣列 n 是參考型別,所以即使傳遞機制是 ByValincrease 也可以變更其成員。

第二個 MsgBox 呼叫會顯示「取代 (n) 之後:11、21、31、41」。 因為 n 已傳遞 ByVal,所以 replace 無法指派新的陣列來修改呼叫程式碼中的變數 nreplace 建立新的陣列執行個體 k 並將它指派給區域變數 a 時,它會失去呼叫程式碼對於 n 傳入的參考。 其變更 a 的成員時,只會影響區域陣列 k。 因此,replace 不會遞增呼叫程式碼中陣列 n 的值。

編譯程式碼

Visual Basic 中的預設值是以傳值方式傳遞引數。 不過,使用每個宣告的參數來包含 ByValByRef 關鍵字是很好的程式設計作法。 這可讓您的程式碼更容易閱讀。

另請參閱