level 1
VB.net子程序传参的困惑(ByVal 和Byref 没有区别的时候是为什么??) Public Class Form1
2014年04月01日 13点04分
1
level 1
我也在学习VB.NET昨天刚好有兴趣研究了一下这个问题下面是我的一些见解有问题还请指出。
首先他们两个还是有明显区别的 一个是传值一个是传引用
byval
对于基本类型byval就是把实参的值 COPY一份然后给形参
引用类型也就是对象型的实参他的byval其实是吧引用的值COPY一份然后传递给形参(类似于传指针)
byref
对于基本类型byref就是把实参的引用 COPY一份然后给形参
对象型的就是把引用的引用传递给形参,类似于(指针的指针,当然只是类似用法还是有区别)
总体来说对于一个方法,形参在方法运行完之后就可以认为是没有了,对传递进来的实参是不会造成影响的。(有的人可能说了 如果对一个对象属性做了修改,外部的实参不是也改变了吗,可事实上传进来的是引用,改动的是引用指向的值!引用本身并没有发生改变。也就是说你不能改变(真正)传进来的值)
这个是我最近刚好研究过的实验用例 你可以把参数改成byref 和 byval你可以得到不同的结果来理解。
Imports System.Text.StringBuilder
Module Module1
Sub Main()
Dim sb1 As New System.Text.StringBuilder("A")
Dim sb2 As New System.Text.StringBuilder("B")
Dim sb3 As New System.Text.StringBuilder("C")
Operation(sb1, sb2, sb3)
Console.WriteLine(sb1.ToString + ":" + sb2.ToString)
Console.ReadLine
End Sub
Private Sub Operation(ByRef sb1 As System.Text.StringBuilder, ByRef sb2 As System.Text.StringBuilder, ByRef sb3 As System.Text.StringBuilder)
sb1.Append(sb2)
sb2 = sb1
sb2 = sb3
End Sub
End Module
2014年04月02日 06点04分
4
level 13
楼上没错。
我给个进阶点的例子。你学到后面就能看懂了
Imports System.Runtime.InteropServices.Marshal
Imports System.Drawing
'...省略一些
Sub 把点归零(pt As IntPtr)
Dim pt1 As point=PtrToStructure(pt,point)
pt1.x=0
pt1.y=0
pt=StructureToPtr(point,pt1,True)
End Sub
效果相当于
Sub 把点归零(ByRef pt As Point)
pt.x=0
pt.y=0
End Sub
明显简化了操作。
2014年04月04日 13点04分
5