VB中数组传参ByVal与ByRef无差异?求技术解答
VB.NET中数组ByVal与ByRef传参的差异解析
这是因为数组在VB.NET中属于引用类型,这是两种传参方式修改元素都能影响原数组的核心原因。
核心机制说明
- 当使用
ByVal传递数组时,传递的是原数组对象引用的副本——过程里的参数和原变量指向的是同一个数组对象。所以修改数组元素时,操作的是同一块内存中的数组数据,自然会同步到原数组。 - 当使用
ByRef传递数组时,传递的是原数组变量本身的引用,过程里的参数就是原变量的"别名"。此时不仅修改元素会影响原数组,若在过程中给参数重新赋值一个新数组对象(比如pstudarr = New String(3) {}),原变量也会指向这个新数组,该修改会直接带出过程。
结合你的测试代码分析
你的测试仅修改了数组的元素值,没有对数组变量本身进行重新赋值操作,因此两种传参方式的表现完全一致。若要看到差异,可以给display过程添加数组重新赋值的逻辑:
ByVal版本示例
Sub display(ByVal pstudarr() As String) Dim count As Integer For count = 0 To 3 Console.WriteLine(pstudarr(count)) pstudarr(count) = "zzzzzzz" Next ' 尝试替换整个数组 pstudarr = New String(3) {"new1", "new2", "new3", "new4"} End Sub
此时Main中第二次调用display时,输出的仍然是"zzzzzzz"——因为原数组变量studarr并没有被替换,过程里只是修改了引用副本的指向。
ByRef版本示例
Sub display(ByRef pstudarr() As String) Dim count As Integer For count = 0 To 3 Console.WriteLine(pstudarr(count)) pstudarr(count) = "zzzzzzz" Next ' 替换整个数组 pstudarr = New String(3) {"new1", "new2", "new3", "new4"} End Sub
执行这段代码后,原数组变量studarr会指向新数组,第二次调用display就会输出"new1"至"new4"。
总结
ByVal和ByRef的差异不在于是否能修改数组元素,而在于是否能在过程中替换整个数组对象并让原变量同步改变。你之前的测试场景未触及后者,所以看不到区别。
内容的提问来源于stack exchange,提问作者maryline
相关产品推荐
相关产品推荐

