BYVAL
通过价值传递
-
当值传递
ByVal
时,过程会收到值的副本。Public Sub Test() Dim foo As Long foo = 42 DoSomething foo Debug.Print foo End Sub Private Sub DoSomething(ByVal foo As Long) foo = foo * 2 End Sub
调用上述
Test
过程输出 42.DoSomething
被赋予foo
并接收该值的副本。副本乘以 2,然后在程序退出时丢弃; 来电者的副本从未改变过。 -
当参考被传递
ByVal
,程序接收一个拷贝的指针。Public Sub Test() Dim foo As Collection Set foo = New Collection DoSomething foo Debug.Print foo.Count End Sub Private Sub DoSomething(ByVal foo As Collection) foo.Add 42 Set foo = Nothing End Sub
调用上述
Test
过程输出 1DoSomething
是给定foo
并接收一个拷贝的指针到Collection
对象。由于Test
范围中的foo
对象变量指向同一对象,因此在DoSomething
中添加项目会将该项目添加到同一对象。因为它是指针的副本,所以设置它对Nothing
的引用不会影响调用者自己的副本。