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指向的实例没关系了。
- vb.net中关于byval和byref的使用
- VB中ByVal和ByRef
- VB.NET 中 ByVal 和 ByRef 传参方法的区别
- VB.Net的ByVal和ByRef --ByVal时的浅拷贝和深拷贝
- [转] VB.Net的ByVal和ByRef --ByVal时的浅拷贝和深拷贝
- 数据搬运工-VB中参数(ByVal,ByRef)的传递
- ByVal和ByRef的区别
- ByVal和ByRef的区别
- Byval 和 Byref的区别
- VBScript的中ByRef和ByVal的不同
- Byval和ByRef
- ByVal和ByRef
- ByRef和ByVal
- 写给初学者:VB 中 ByRef 与 ByVal 参数传递方式的区别
- (菜鸟成长记录)VB中的ByVal和ByRef的区别
- VB中ByVal与ByRef有什么区别
- byref和byval什么时候该使用什么时候不该使用
- Byval与Byref的区别
- Nginx 变量漫谈(一)
- 好的程序员做不出好的软件设计
- 数组大折腾
- JavaScript判断浏览器类型及版本
- 批量删除VC,VS临时文件
- vb.net中关于byval和byref的使用
- POI读取EXCEL教程
- C++十四周任务-数组大折腾
- 在ADF中使用AutoSuggest
- cookie的path和domain属性解析
- C#中抽象类和接口的区别
- Nginx 变量漫谈(二)
- 配置MSVC命令行环境
- 只能输入数字的方法