在网上找了一下,觉得这个帖子关于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 传参方法的区别
最新推荐文章于 2018-11-17 11:21:04 发布