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 过程输出 1 DoSomething 是给定 foo 并接收一个拷贝指针Collection 对象。由于 Test 范围中的 foo 对象变量指向同一对象,因此在 DoSomething 中添加项目会将该项目添加到同一对象。因为它是指针的副本,所以设置它对 Nothing 的引用不会影响调用者自己的副本。