共用方式為


如何:保護程式自變數免受值變更 (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 是參考型別, increase 即使傳遞機制是 ByVal,也可以變更其成員。

第二個 MsgBox 呼叫會顯示 「After replace(n): 11, 21, 31, 41」。 因為 n 被傳遞到 ByValreplace 無法在呼叫程式碼中通過指派新的陣列給變數 n 來修改它。 當replace建立新的數組實例k並將它指派給局部變數a時,它會失去呼叫的程式碼傳入的參考n。 當它變更成員 a 時,只會影響本地陣列 k。 因此, replace 不會在呼叫程式代碼中遞增數位列 n 的值。

編譯程式碼

Visual Basic 中的預設值是依值傳遞自變數。 然而,在每個宣告的參數中加入 ByValByRef 關鍵詞是很好的程式設計做法。 這可讓您的程式代碼更容易閱讀。

另請參閱