我有一个程序load时生成了一个dataset1数据集
后来该程序调用一引用的dll,
Dim temp_frm as new 引用dll(dataset1.tables("表1"))
该"引用dll"实例化方法是:
sub new (byref table1 as datatable)
'代码
end sub
想问问上面temp_frm实例化后传过来的table1是不是仅仅是引用dataset1.tables("表1")的地址?
如果改改那个"引用dll" new方法:
sub new (byval table1 as datatable)
'
end sub
实例化temp_frm后和上面有何区别?
---------------------------------------------------------------
.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),将导致该方法或者被调用方具
有自己的该参数值的私有拷贝。如果参数是引用类型,那么,按值
传递的是引用(而不是实例,就是把对该实例的引用复制一份传递给
参数)
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指向的实例没关系了。
按引用传递参数导致方法或被调用方法得到一个托管指针,它指
回调用方的变量。方法对值类型或引用类型所作的任何修改对于
调用方都是可见的。并且,假如这个方法对一个对象引用的参数
进行修改,使之重定向到内存中的另外一个对象,那么,这个改变
也将影响调用方的变量。
Private Sub Adjust(ByRef obj As Object)
obj = New Object
End
Adjust(o) '这时候, o 指向方法里New出来的实例。
值类型在参数ByVal, ByRef上比较:
ByVal:
Dim a1 As Integer = 1
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Add(a1)
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Private Sub Add(ByVal x As Integer)
x = x + 1
End Sub
'------------------------------------------------------
ByRef:
Dim a1 As Integer = 1
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 1
Add(a1)
Console.WriteLine( "a1 = {0}", a1.ToString() ) 'a1 = 2
Private Sub Add(ByRef x As Integer)
x = x + 1
End Sub
-------------------
String是引用类型,只是它很特殊,它是恒定不变的。在创建之后就不能修改了。
这使得String的行为看起来像个值类型。