VB.NET 中 ByVal 和 ByRef 传参方法的区别

在网上找了一下,觉得这个帖子关于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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值