引用类型与值类型

CLR的类型系统将对应简单值的类型同对应传统“对象”的类型区分开来。前者被称为值类型(value type);

后者被称为引用类型(reference type)。

值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。

引用类型存储对其值的内存地址的引用,位于堆上。

.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不是同一实例

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指向的实例没关系了。
  
  
   按引用传递参数导致方法或被调用方法得到一个托管指针,它指
   回调用方的变量。方法对值类型或引用类型所作的任何修改对于
   调用方都是可见的。并且,假如这个方法对一个对象引用的参数
   进行修改,使之重定向到内存中的另外一个对象,那么,这个改变
   也将影响调用方的变量。

   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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值