简而言之,ByRef 和 ByVal 的区别在于参数源是否可以被函数修改,前者(默认方式)是可以被修改的,而后者是不能被修改的。
例:
调用:
程序执行后的结果为:
I love WYC!;This is b!
原因是:ByRef 类型的参数在函数过程中被重新赋值,所以函数调用结束后,a变量的值为新被赋予的“I love WYC!”,而作为 ByVal 类型的参数b,由于不能被程序修改,即使在函数过程中对该变量重新赋值,其值仍为函数调用前的“This is b!”。另外,声明 ByRef 类型的参数时,可以不声明为 ByRef <参数><类型>,而只用 <参数><类型> 即可, ByVal 则必须使用 ByVal <参数><类型>。
例:
Private Function Func(ByRef argv1 As String, ByVal argv2 As String)
argv1 = "I love WYC!"
argv2 = "I love WYC!"
End Function
argv1 = "I love WYC!"
argv2 = "I love WYC!"
End Function
Sub Main()
Dim a As String, b As String
a = "This is a!"
b = "This is b!"
Func a, b
MsgBox a & ";" & b
End Sub
Dim a As String, b As String
a = "This is a!"
b = "This is b!"
Func a, b
MsgBox a & ";" & b
End Sub
原因是:ByRef 类型的参数在函数过程中被重新赋值,所以函数调用结束后,a变量的值为新被赋予的“I love WYC!”,而作为 ByVal 类型的参数b,由于不能被程序修改,即使在函数过程中对该变量重新赋值,其值仍为函数调用前的“This is b!”。另外,声明 ByRef 类型的参数时,可以不声明为 ByRef <参数><类型>,而只用 <参数><类型> 即可, ByVal 则必须使用 ByVal <参数><类型>。