修饰符 ByVal 表示将参数按值传递给过程或函数。在 Visual Basic 中,ByVal 默认使用,并确保在过程内部对参数的修改不会影响调用方传递的原始变量。
在经典版本的 VB 中,任何参数可以通过值或引用两种方式传递。随着语言的发展和复杂数据类型(结构、类)的出现,选择 ByVal 和 ByRef 之间的意识变得越来越重要。
错误选择参数传递方式常常导致错误:可以意外改变调用代码的变量,或者相反——等待不会发生的更改。
当过程需要处理值的副本时,使用 ByVal。它用于传递原始类型、结构,有时甚至是引用类型,如果保持引用很重要。
代码示例:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' 返回 10,而不是 11
关键特点:
如果将对象(例如类的实例)以 ByVal 修饰符传递,结果会如何?
答:传递的是对对象的引用副本,而不是对象本身。可以从过程内部更改对象的字段——更改在外部是可见的。引用本身,而不是对象,不能在过程内部被替换为新的,从而影响调用代码。
代码示例:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' 修改属性! c = New Counters() ' 这个更改在调用代码中不可见 End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' 输出 999
如果在过程内部更改结构的字段,通过 ByVal 传递时,结构的值会改变吗?
答:不会,整个结构实例是被复制的,更改不会传递到外部。每一个结构记录,例如 Point,在过程内部是独立的。
是否必须明确指定参数的 ByVal?
答:不,ByVal 默认使用,显式指定只是为了更好的可读性和遵循编码风格。
开发者以 ByVal 传递数组给函数,期望能够在数组中修改元素并且调用方将得到一个新的数组(实际上引用类型是通过引用传递的)。
优点:
缺点:
为了传递不应被函数修改的数组索引,使用 ByVal。即使在内部更改索引值,原始变量不会受到影响。
优点:
缺点: