【VB.NET高效编程】之『ByVal 和 ByRef』
vb2010吧
全部回复
仅看楼主
level 9
lipeiyi2006 楼主
2012年08月13日 00点08分 1
level 9
lipeiyi2006 楼主
我们在编写程序时,往往会用到函数(Function),也时常会向函数传递参数f(x,y,z)……
在VB.NET中有两种参数传递形式,一种是ByVal(按值传递),另一种是ByRef(按地址传递)。
PS:ByVal = By Value ; ByRef = By Reference (有时也叫 按 引用 传递)
那么说了半天这个按值,按地址传递究竟是什么?怎么工作的?有什么区别吗?
一般而言,ByRef是为程序的高效性而设计的,但往往许多新手甚至是老手为了方便,全部用ByVal,反正两个效果都一样。
那么现在我就来说说这个神奇的参数传递。
2012年08月13日 00点08分 2
level 9
lipeiyi2006 楼主
在学习之前,我们有必要这样理解一下ByVal和ByRef的区别?

Function A(ByVal s As Integer)
 Return s + 1
End Function

Function B(ByRef s As Integer)
 Return s + 1
End Function
我们调用上面两个函数,执行结果都是一样的,没什么区别,但是从原理上将是截然不同的。
我们知道变量或者是参数都会在内存中得到自己的地址和内存空间,变量好理解,但是参数呢?
我们不妨这样理解:

按值传递时:
   -> Call A(5)
      |
      〉
Function A(ByVal s As Integer)
   => Dim s As Integer = 5
 Return s + 1
End Function

按地址传递时:
   -> Call B(5)
      |
      〉
Function B(ByRef s As Integer)
 => s就是常量5
 => Return 5 + 1
End Function
ByRef的参数不必占用新的内存空间。而是对传递进来的数据直接引用(别名)

2012年08月13日 01点08分 3
简单来说就是ByVal就是把值传递,而ByRef是把变量地址传递
2012年08月13日 01点08分
回复 877120274 :这个貌似就是程序的运行效率问题吧. 像ASM竟赛一样...
2013年12月12日 10点12分
回复 877120274 :Sorry,应该是ACM
2013年12月12日 10点12分
level 9
lipeiyi2006 楼主
这样一来,我们用ByRef方式传递参数就会显得更加快速,免除了对象的复制,减少了内存占用。
我们有这样一个For用来计算从1-10000的总和:
Dim Result As Integer = 0
Sub sum(ByVal s As Integer)
 Result += s
End Sub
For i As Integer = 1 To 10000
 Call sum(i)
Next
这样一来i将被复制10000次,虽然Sub结束时会自动释放内存,不影响内存占用量,但是这样效率会大打折扣。
使用ByRef能有效解决效率问题。特别是在使用【递归】的时候。还有在大型Class拷贝的时候会花费较长的时间,可以考虑用ByRef。
注意:不要把ByVal全部换成ByRef,使用ByRef有前提:
 明确变量在函数体中是不是只读的(会不会这样使用赋值语句:变量 = 值 )?如果不经意间改变了原来的值,将带来不可预料的后果!

2012年08月13日 01点08分 6
level 9
lipeiyi2006 楼主
如果有任何错误的地方还望指出,随便喷~
->>>>>>>>>>>>>>>>>>>>>>>>>>>> ybusad 2012/8/13
2012年08月13日 01点08分 7
level 8
2013年07月22日 06点07分 12
level 10
呵呵,平时也经常用ByRef,Byval总是说不能改变什么的。
2013年07月22日 15点07分 13
level 10
对,我很喜欢你说的话~~
2014年01月02日 02点01分 14
1