整理自20004年csdn的帖子
不讲废话, 看代码。
Public Class APrivate _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,解除了绑定。
byRef时,参数a和a1一样(别名),所以当a被置为nothing时,a1也被置为nothing。
用ByRef传递参数,参数值会在子程序中改变。
用ByVal传递参数,参数值不会在子程序中改变。