如何:更改过程参数的值 (Visual Basic)

当调用过程时,您提供的每个参数对应于过程定义的一个参数。 在某些情况下,过程代码可能能够更改调用代码中作为实参基础的值。 在某些情况下,过程可以更改实参的本地副本。

当调用过程时, Visual Basic 进行传递 ByVal (Visual Basic)的本地副本每个参数。 为传递的每 ByRef (Visual Basic)个参数, Visual Basic 为直接对基础调用代码中的编程元素的一个参数的程序代码。

如果在调用代码中的基础元素是一个可修改元素,并传递 ByRef,过程代码可以使用直接引用更改调用代码中元素的值。

更改基础值

更改过程实参的基础值在调用代码中

  1. 在过程声明中,为参数指定 ByRef (Visual Basic) 与实参对应。

  2. 在调用代码中,将可修改的编程元素作为参数。

  3. 在调用代码中,不要将实参括号中的参数列表。

  4. 在过程代码中,使用形参名称将值赋给调用代码中的基础元素。

为演示进一步参见示例滚动。

更改本地副本

如果在调用代码中的基础元素是不可更改元素,或者,如果传递 ByVal,则过程不能在调用代码中更改它的值。 但是,过程可以更改这样实参的本地副本。

更改过程实参的副本在程序代码中

  1. 在过程声明中,为参数指定 ByVal (Visual Basic) 与实参对应。

    - 或 -

    在调用代码中,将实参括号中的参数列表。 这可以强制 Visual Basic 传递参数值,因此,即使相应的参数指定 ByRef。

  2. 在过程代码中,使用形参名称将值赋给实参的本地副本。 不更改调用代码中的基础值。

示例

下面的示例演示获取数组变量并对其元素的两个过程。 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 调用显示 “after increase(n):11, 21, 31, 41 "。 由于数组n是引用类型,replace可以更改其成员,因此,即使传递机制为 ByVal。

第二 MsgBox 调用显示 “after replace(n):101, 201, 301 "。 由于 n 通过 ByRef,replace能更改调用代码中的变量的n并将一个新数组赋给它。 由于n是引用类型,replace还可以更改其成员。

可以防止过程更改调用代码中的变量。 请参见 如何:防止过程参数的值被更改 (Visual Basic)

编译代码

当通过引用传递变量时,必须使用 ByRef 关键字指定此机制。

在 Visual Basic 的默认值是通过值传递实参。 但是,好的编程习惯。声明每个 ByVal (Visual Basic) 形参或 ByRef (Visual Basic) 关键字。 这将使您的代码更容易阅读。

安全性

始终有允许程序的一个风险能够更改调用代码中作为实参基础的值。 请确保您希望此值更改为和准备签出对使用。

请参见

任务

如何:将参数传递给过程 (Visual Basic)

如何:防止过程参数的值被更改 (Visual Basic)

如何:强制通过值传递参数 (Visual Basic)

概念

Visual Basic 中的过程

过程参数和变量 (Visual Basic)

通过值和通过引用传递参数 (Visual Basic)

可修改和不可修改参数之间的差异 (Visual Basic)

通过值传递参数和通过引用传递参数之间的差异 (Visual Basic)

按位置和名称传递参数 (Visual Basic)

值类型和引用类型