查看: 851  |  回复: 0
  VB6 ByRef和ByVal的区别
楼主
发表于 2024年3月13日 20:34

新建From1(窗体),新建Command1(按钮CommandButton),代码:

Private Sub Command5_Click()
    Dim intA As Integer
    intA = 0: Call s_1(intA): Debug.Print intA
    intA = 0: Call s_2(intA): Debug.Print intA
    intA = 0: Call s_3(intA): Debug.Print intA
End Sub

Private Sub s_1(intA As Integer) '等效于ByRef
    intA = 1
End Sub

Private Sub s_2(ByRef intA As Integer)
    intA = 2
End Sub

Private Sub s_3(ByVal intA As Integer)
    intA = 3
End Sub

运行结果:

 1 
 2 
 0

ByRef:(默认情况下,当省略传递类型时,默认值是 ByRef)传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量的值。比如:

Option Explicit

Private Sub Command1_Click()
    Dim arrA(0) As Byte
    'Dim arrA$ '会显示重复声明,无效
    
    Call s_1(arrA)
    Debug.Print arrA(0)
    
    Call s_2(arrA)
    Debug.Print arrA(0)
    
    'Call s_3(arrA) '会提示ByRef参数类型不符
    'Debug.Print arrA(0)
End Sub

Private Sub s_1(arrA() As Byte) 'ByVal是错误的,只能用空或ByRef,空=ByRef
    arrA(0) = 65
End Sub

Private Sub s_2(ByRef arrA() As Byte)
    arrA(0) = 66
End Sub

'Private Sub s_3(arrA As Byte)
    'arrA(0) = 67
'End Sub

运行结果:

 65 
 66

ByVal:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。

由于ByVal会产生副本,会新建存储空间,所以比ByRef和默认更占用资源。

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2026 MaNongKu.com