在网上找了一下,觉得这个帖子关于ByVal 和 ByRef 说的比较清楚,所以就贴过来了。
Public Class A
Private _size As Int32
Public Property size()
Get
Return _size
End Get
Set(ByVal Value)
_size = Value
End Set
End Property
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a1 As A
Dim t As Int32
a1 = New A
a1.size = 8
t = a1.size
updateA1ByVal(a1)
If Not IsNothing(a1) Then
Console.WriteLine("a1 update by val from " & t & " to " & a1.size)
Else
Console.WriteLine("a1 changed to nothing by updateA1ByVal")
End If
updateA1ByRef(a1)
If Not IsNothing(a1) Then
Console.WriteLine("a1 update by ref from " & t & " to " & a1.size)
Else
Console.WriteLine("a1 changed to nothing by updateA1ByRef")
End If
End Sub
Private Sub updateA1ByVal(ByVal a As A)
a.size = 9
a = Nothing
End Sub
Private Function updateA1ByRef(ByRef a As A)
a.size = 9
a = Nothing
End Function
执行结果
a1 update by val from 8 to 9
a1 changed to nothing by updateA1ByRef
这个跟.net的后期绑定有关系,传递的参数实际上不是类A的一个对象,而是指向这个对象的一个值a1, 请注意a1本身不仅是一个符号,它有自己的值。
byVal时,参数a的值和a1一样,所以都指向最初New出的那个实例(后期绑定)。当a.size先被修改为9时,因为最初New出的实例应经和它绑定,所以也被修改为9,然后参数a置为nothing,解除了绑定。(这里a 实际就相当一个指向a1的指针, 这个指针在指向a1对象的时候,所有的操作都会对a1对象产生作用.但是当a = Nothing, 或者 a1 指向其他对象实例的时候, a1本身就不会再受到a的影响了。)
byRef时,参数a和a1一样(别名),所以当a被置为nothing时,a1也被置为nothing。
套用一句大师的话
In C++: pass object by value , pass object by reference 。
In Java: pass object reference by value
也许我们可以这样说
In vb.net: pass object reference by value (ByVal), pass object by reference(ByRef)。
本文深入探讨了VB.NET中ByVal与ByRef参数传递方式的区别。通过具体代码示例,解释了ByVal如何传递对象引用的副本,而ByRef则直接传递对象引用,导致在函数内部对对象的修改是否会影响原始对象的不同结果。

6394

被折叠的 条评论
为什么被折叠?



