关于VB里proc调用和ByVal、ByRef的用法。

2024年11月18日 17:25
有3个网友回答
网友(1):

Proc只是自定义的过程名,只是一个代号, 你可以随意更改成符合规则的过程名 比如Sub NewProc或者Sub Proc2 都可以

ByVal,ByRef之间正规的解释为按值传递和按址传递 涉及到指针的内容.因为VB的局限性对指针没有很好的解释.所以如果你不深究的话可以这么理解.
下面是一个举例的代码
dim a as integer,b as integer,c as integer
'定义a b c三个变量 用过调用 Test这个过程 研究 a b c是否变化及其原因
a=10
b=10
c=10
'将a b c都初值化为10
Test a,b,c
'调用过程 来尝试改变 a b c的值 调用时 a 对应过程中的X ,b 对应y,c对应z
debug.print a
debug.print b
debug.print c
'调用过程以后调试输出a b c三者的值 与原来对比
Sub Test(ByVal x integer,ByRef y as integer, z as integer)
x=x+1

y=y+1

z=z+1
End Sub

当参数 以 ByVal的方式调用时 参数在调用时产生了一个替身.所有对于参数变化的指令都在这个替身上完成.因为都是对替身的操作 所以并不影响原来参数本身的值.
上面的代码上 x 就是以 ByVal方式调用的 所以 在Test的过程中.x产生了一个一样的替身
因为是一样的 所以这个替身的值也是10
然后这句x=x+1 就是这个替身自身的值+1 (注意 这个x是替身) 那么替身的值就变成了11
然后过程调用结束后.替身消失,而原来的值是和替身没有关系的 所以原来的值还是10

而当参数 以 ByRef的方式调用时.参数是不产生这个所谓的替身的.就是说 这个参数是自己本身去参与了过程中对参数的操作的.
上面的代码中 y 是以Byref方式调用的.那么 因为它对应的是b 所以值是10
然后y=y+1 这里是对参数y 本身的操作 而没有替身 所以 y 本身变成了11
而因为y对应的是b 所以 b也就变成了11

而当参数并没有声明以ByVal或者ByRef时调用参数时 其实就是默认省略了以ByRef方式调用(也就是不产生替身的方式,值得注意的是,这个规则是仅适用于VB6以及之前的版本的 在VB.NET中是默认省略了ByVal方式)

了解了这些 你就知道为什么选A了.
题目要求是要返回形参的变化结果,而使用替身操作的ByVal方式并没会影响原来参数的结果,所以不采用这种调用方式,
因为A中没有声明 ByVal或者ByRef时调用参数,就是默认省略了以ByRef方式调用,也就是说 A语句中的代码和下面代码是等价的
Sub Proc(ByRef x as Integer,ByRef y as Integer)

也就是在过程中的改变会影响自身的参数调用方式

网友(2):

可以看看我的空间里的文章:
VB6 当中自定义过程和函数的参数类型

网友(3):

BYREF说明白点就是在过程中使用的数值和外面的数值相等了,并且一旦在过程中改变了这个数值,那么引用过程的数值也修改了。一般来说缺省就是BYREF。
优点:节约一个内存地址的大小,并且实现数值的修改
BYVAL指的是为这个变量在内存中重新开辟一个地址进行存储。在过程中修改这个数值不会影响这个数值。
(1)ByRef
例如
SUB byr(byref a as integer)'BYREF不写也是对的
a=10
end SUB

然后如果我们这样用
Dim x as integer
byr x
msgbox x
输出10

(2)ByVal
例如
SUB byv(byval a as integer)
a=10
end SUB
然后再
Dim x as integer
byv x
msgbox x