vb.net中关于byval和byref的使用

来源:互联网 发布:美股港股实时行情软件 编辑:程序博客网 时间:2024/05/01 13:23

在vb.net中,byval和byref使用是不同的:

.NET中CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。

前者被称为值类型(value type),后者被称为引用类型(reference type)。
值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。
引用类型存储对其值的内存地址的引用,位于堆上。


值类型和引用类型的赋值操作是不同的:
1)对于引用类型,赋值只是简单地复制对原实例的一个引用,
这导致在内存中两个变量将引用同一个实例。

Dim o1 As Object = New Object
Dim o2 As Object
o2 = o1 'o1给o2赋值,传递引用。o1,o2指向同一实例
如果是自己编写的类,就是按照引用类型传递的;
2)对于值类型,赋值是将一个实例的内容改写为其他实例的内容。
Dim a1 As Integer = 1
Dim a2 As Integer = 0
a2 = a1 'a1给a2赋值,a2内容被改写为1, a1与a2不是同一实例
但是在平时,我们会发现,编写一个函数,如果不注意,在传入一个类时,我们使用了byval来定义,那么当这个函数执行完之后,这个类也就改变了,从表面看来,byval和byref没有区别,我们怎么用都行,但是,实际上不是这样,如果我们使用的是byval,在这个被调用的函数中就会多一个临时的类,根据引用类型的传递法则,传入的类和这个临时类就会指向同一个实例,当函数执行完,这个临时类就消失了,所以从表面上看是没有区别的。如果程序很小的话,就没有什么问题,如果传入的类很大,那么这个临时类也会很大,对程序反而不好。如果我们使用了byref,会是什么样子呢?因为传递的是地址,所以被调用的函数只是在传入的地址里面修改东西,并不会增加一个临时类,所以也可以起到相同的效果。对于一个初学者来说,怎么用都行,但是对于一个高级程序员,遇到类似的情况,我们就要考虑是否要用byref了。

下面有一个例子作为说明(是我从百度空间里转的):

3) 向方法传递参数是赋值的变体。当向方法传递参数时,方法的声明
决定参数是按引用传递还是值传递(不管参数是值类型还是引用类
型)。默认是按值传递参数(ByVal),将导致该方法或者被调用方具
有自己的该参数值的私有拷贝。如果参数是引用类型,那么,按值
传递的是引用(而不是实例,就是把对该实例的引用复制一份传递给
参数)

Dim o As Object = New Object

Private Sub Adjust(ByVal obj As Object)
'...
End Sub

Adjust(o) '<--- 这里其实,有参数赋值的过程 o = obj,
' o被方法Adjust复制了一份。
' 因为o是引用类型,所以o和obj指向同一实例。
' 这里修改了obj就相当修改了o

-----------------------------------------------------

修改一下Adjust方法:
Private Sub Adjust(ByVal obj As Object)
obj = New Object
End Sub
再调用这个方法的时候,obj在方法里指向了一个新的实例,
与o指向的实例没关系了。

原创粉丝点击