ByVal和ByRef的区别?

时间:2021-07-12 13:55:33
  能不能理解为,前者是值传递,后者是地址传递(类似指针)?
  ByRef麻烦举个实例应用下,或者指个方向,我不知道在什么情况下应该用ByRef.

7 个解决方案

#1


byref传引用
byval传值

function ByRefFun(byref va as string)
    
end function

#2


byref传引用
byval传值

这个是计算机编程基础问题。GOOGLE

#3


怎么说呢?byref确实有点类似指针,一般在你需要返回值的情况下,要么用函数(function)或者用子过程(sub).子过程就需要一个变量通过传址来带回返回值。。。。

#4


差不多就是那个意思,举个例子吧(里面的算法不是最优的算法):
Public Class Form1
Private Sub GetMaxAndMin(ByVal arr As Integer(), ByRef min As Integer, ByRef max As Integer)
If arr(0) > arr(1) Then
min = arr(1)
max = arr(0)
Else
min = arr(0)
max = arr(1)
End If
Dim i As Integer
For i = 2 To arr.Length - 1
If arr(i) > max Then
max = arr(i)
End If
If arr(i) < min Then
min = arr(i)
End If
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a() As Integer = New Integer() {3, 5, 2, 4, 1}
Dim min As Integer
Dim max As Integer
GetMaxAndMin(a, min, max)
MsgBox(String.Format("Min:{0}, Max:{1}", min, max))
End Sub
End Class

#5


ByVal 与 ByRef

Private Sub Command1_Click()
Dim a As Integer
Dim b As Integer
Print a
Print b
Call fun(a, b)
Print a
Print b
End Sub
Public Function fun(ByVal a As Integer, ByRef b As Integer)
a = a + 1
b = b + 1
End Function

Byval 传值:系统会自动建立一个变量,运算时这个变量参与运算,而实参不会改变
Byref 传址:实参直接参与计算

(1)ByVal指的是按值传递,程序会将被传递的参数的值拷贝一份存在一个临时区域中参与调用过程的执行,在代码中即使使用诸如a=a+1之类改变参数值的语句,实际改变了它的副本内容,而并没有真正改变a的内容;
(2)与之相对应的是ByRef,是指按地址传递参数,是缺省的方式。在被调用时传递给调用函数的是其地址,这样一来,在调用函数中对这个参数做出的任何改变都直接变了它的值,程序会根据参数存放的地址直接对它进行修改,即使跳出被调函数或过程这个改变还是永久的。我们知道,变量在内存中的地址是唯一的,是由程序动态分配的,除非你释放并且系统回收。

(3)传值系统会为参数分配一个地址空间,所有在被调用过程里对参数的改变不会反映到调用它的地方,(4)传址是引用调用,系统不会给参数分配空间,参数也是指向原变量的地址。对参数的改变会反映到原变量,因为他们指向了同一内存空间

#6


按值(ByVal)传递和按地址(ByRef)传递.
区别是:
按值: 一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。也就是说传递的是变量的内容。 
按地址: 一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。也就是说传递的是变量再内存中地址的指针或引用。

#7


thanks

#1


byref传引用
byval传值

function ByRefFun(byref va as string)
    
end function

#2


byref传引用
byval传值

这个是计算机编程基础问题。GOOGLE

#3


怎么说呢?byref确实有点类似指针,一般在你需要返回值的情况下,要么用函数(function)或者用子过程(sub).子过程就需要一个变量通过传址来带回返回值。。。。

#4


差不多就是那个意思,举个例子吧(里面的算法不是最优的算法):
Public Class Form1
Private Sub GetMaxAndMin(ByVal arr As Integer(), ByRef min As Integer, ByRef max As Integer)
If arr(0) > arr(1) Then
min = arr(1)
max = arr(0)
Else
min = arr(0)
max = arr(1)
End If
Dim i As Integer
For i = 2 To arr.Length - 1
If arr(i) > max Then
max = arr(i)
End If
If arr(i) < min Then
min = arr(i)
End If
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a() As Integer = New Integer() {3, 5, 2, 4, 1}
Dim min As Integer
Dim max As Integer
GetMaxAndMin(a, min, max)
MsgBox(String.Format("Min:{0}, Max:{1}", min, max))
End Sub
End Class

#5


ByVal 与 ByRef

Private Sub Command1_Click()
Dim a As Integer
Dim b As Integer
Print a
Print b
Call fun(a, b)
Print a
Print b
End Sub
Public Function fun(ByVal a As Integer, ByRef b As Integer)
a = a + 1
b = b + 1
End Function

Byval 传值:系统会自动建立一个变量,运算时这个变量参与运算,而实参不会改变
Byref 传址:实参直接参与计算

(1)ByVal指的是按值传递,程序会将被传递的参数的值拷贝一份存在一个临时区域中参与调用过程的执行,在代码中即使使用诸如a=a+1之类改变参数值的语句,实际改变了它的副本内容,而并没有真正改变a的内容;
(2)与之相对应的是ByRef,是指按地址传递参数,是缺省的方式。在被调用时传递给调用函数的是其地址,这样一来,在调用函数中对这个参数做出的任何改变都直接变了它的值,程序会根据参数存放的地址直接对它进行修改,即使跳出被调函数或过程这个改变还是永久的。我们知道,变量在内存中的地址是唯一的,是由程序动态分配的,除非你释放并且系统回收。

(3)传值系统会为参数分配一个地址空间,所有在被调用过程里对参数的改变不会反映到调用它的地方,(4)传址是引用调用,系统不会给参数分配空间,参数也是指向原变量的地址。对参数的改变会反映到原变量,因为他们指向了同一内存空间

#6


按值(ByVal)传递和按地址(ByRef)传递.
区别是:
按值: 一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。也就是说传递的是变量的内容。 
按地址: 一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。也就是说传递的是变量再内存中地址的指针或引用。

#7


thanks