VB.net子程序传参的困惑(ByVal 和Byref 没有区别的时候是为什么??)

2024-11-18 12:54:15
推荐回答(1个)
回答1:

  这里觉得没有区别,是因为在SubAddRow 里,我们并没有试图改变形参 t 本身,我们所做的改变都是 t.Rows,我们为 t 添加了行。

  对于形参和实参而言,在ByVal 模式下 temTable 和 t 指向了同一块内存,但是这两个变量本身并不在同一个地址上。在改变 t.Rows时,由于二者都指向同一块内存,所以更改了t.Rows里的行数据;

  在ByRef模式下,temTable 和 t 就是同一块内存,二者在一个地址上,肯定也就指向同一块内存,在改变 t.Rows时,就是对 temTable 的改变。

  在此举个例子:假设我们需要将 temTable 清空,那么我们还是以 t 作为形参,我们可以这样写:

    ' ByVal 方式传参
    Private Sub ClearRow(ByVal t As DataTable)
        t = Nothing
    End Sub
    
    ' ByRef 方式传参
    Private Sub ClearRow(ByRef t As DataTable)
        t = Nothing
    End Sub
    
    ' 并且这样调用
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
     森慎歼   ClearRow(temTable)
        DataGridView1.DataSource = temTable
    End Sub

  这样,就是有区别的了。ByVal方式时,虽然 t 被置为 Nothing ,但是由孝宽于 t 和 temTable 并不是一个此冲变量,并不在同一个地址上,所以 temTable 没有变。

  而 ByRef 时,t 和 temTable 就是同一个变量,在同一个地址上,t = Nothing的同时,temTable 也就是Nothing了。


  如果这个解释还不清楚,可以追问。