You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:52:16